|
1 | 1 | package main |
2 | 2 |
|
3 | 3 | import ( |
| 4 | + "bytes" |
| 5 | + "crypto/rand" |
| 6 | + "crypto/rsa" |
4 | 7 | "crypto/tls" |
| 8 | + "crypto/x509" |
| 9 | + "crypto/x509/pkix" |
| 10 | + "encoding/pem" |
5 | 11 | "fmt" |
6 | | - "math/rand" |
| 12 | + "math/big" |
7 | 13 | "net" |
8 | 14 | "os" |
9 | 15 | "os/signal" |
10 | 16 | "syscall" |
| 17 | + "time" |
11 | 18 |
|
12 | 19 | "github.com/astaxie/beego/logs" |
13 | 20 | "github.com/lxn/walk" |
| 21 | + |
| 22 | + mrand "math/rand" |
14 | 23 | ) |
15 | 24 |
|
16 | 25 | func VersionGet() string { |
17 | | - return "v0.2.1" |
| 26 | + return "v0.2.2" |
18 | 27 | } |
19 | 28 |
|
20 | 29 | func SaveToFile(name string, body []byte) error { |
@@ -94,7 +103,7 @@ func GenerateUsername(length int) string { |
94 | 103 | charSet := "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!@#$%^&*_+-=" |
95 | 104 | username := make([]byte, length) |
96 | 105 | for i := range username { |
97 | | - index := rand.Intn(len(charSet)) |
| 106 | + index := mrand.Intn(len(charSet)) |
98 | 107 | username[i] = charSet[index] |
99 | 108 | } |
100 | 109 | return string(username) |
@@ -129,3 +138,41 @@ func CreateTlsConfig(cert, key string) (*tls.Config, error) { |
129 | 138 | ClientAuth: tls.RequestClientCert, |
130 | 139 | }, nil |
131 | 140 | } |
| 141 | + |
| 142 | +func GenerateKeyCert(addr string) (string, string) { |
| 143 | + max := new(big.Int).Lsh(big.NewInt(1), 128) |
| 144 | + serialNumber, _ := rand.Int(rand.Reader, max) |
| 145 | + subject := pkix.Name{ |
| 146 | + Organization: []string{"simple http server windows app"}, |
| 147 | + OrganizationalUnit: []string{"simple http server windows app"}, |
| 148 | + CommonName: "simple http server windows app", |
| 149 | + } |
| 150 | + |
| 151 | + if addr == "0.0.0.0" || addr == "::" { |
| 152 | + addr = "127.0.0.1" |
| 153 | + } |
| 154 | + |
| 155 | + ipAddress := make([]net.IP, 0) |
| 156 | + ipAddress = append(ipAddress, net.ParseIP(addr)) |
| 157 | + |
| 158 | + template := x509.Certificate{ |
| 159 | + SerialNumber: serialNumber, |
| 160 | + Subject: subject, |
| 161 | + NotBefore: time.Now(), |
| 162 | + NotAfter: time.Now().Add(30 * 24 * time.Hour), |
| 163 | + KeyUsage: x509.KeyUsageKeyEncipherment | x509.KeyUsageDigitalSignature, |
| 164 | + ExtKeyUsage: []x509.ExtKeyUsage{x509.ExtKeyUsageServerAuth}, |
| 165 | + IPAddresses: ipAddress, |
| 166 | + } |
| 167 | + pk, _ := rsa.GenerateKey(rand.Reader, 2048) |
| 168 | + |
| 169 | + derBytes, _ := x509.CreateCertificate(rand.Reader, &template, &template, &pk.PublicKey, pk) |
| 170 | + |
| 171 | + certOut := bytes.NewBuffer(make([]byte, 0)) |
| 172 | + pem.Encode(certOut, &pem.Block{Type: "CERTIFICATE", Bytes: derBytes}) |
| 173 | + |
| 174 | + keyOut := bytes.NewBuffer(make([]byte, 0)) |
| 175 | + pem.Encode(keyOut, &pem.Block{Type: "RSA PRIVATE KEY", Bytes: x509.MarshalPKCS1PrivateKey(pk)}) |
| 176 | + |
| 177 | + return certOut.String(), keyOut.String() |
| 178 | +} |
0 commit comments