( host string, notBefore, notAfter time.Time, usage CertType, altDNSNames []string, )
| 153 | } |
| 154 | |
| 155 | func (pair KeyPair) createAndSignPairWithValidity( |
| 156 | host string, |
| 157 | notBefore, |
| 158 | notAfter time.Time, |
| 159 | usage CertType, |
| 160 | altDNSNames []string, |
| 161 | ) (*KeyPair, error) { |
| 162 | caCertificate, err := pair.ParseCertificate() |
| 163 | if err != nil { |
| 164 | return nil, err |
| 165 | } |
| 166 | |
| 167 | caPrivateKey, err := pair.ParseECPrivateKey() |
| 168 | if err != nil { |
| 169 | return nil, err |
| 170 | } |
| 171 | |
| 172 | // Generate a new private key |
| 173 | leafKey, err := ecdsa.GenerateKey(elliptic.P256(), rand.Reader) |
| 174 | if err != nil { |
| 175 | return nil, err |
| 176 | } |
| 177 | |
| 178 | // Sign the public part of this key with the CA |
| 179 | serialNumberLimit := new(big.Int).Lsh(big.NewInt(1), 128) |
| 180 | serialNumber, err := rand.Int(rand.Reader, serialNumberLimit) |
| 181 | if err != nil { |
| 182 | return nil, fmt.Errorf("can't generate serial number: %w", err) |
| 183 | } |
| 184 | |
| 185 | leafTemplate := x509.Certificate{ |
| 186 | SerialNumber: serialNumber, |
| 187 | NotBefore: notBefore, |
| 188 | NotAfter: notAfter, |
| 189 | BasicConstraintsValid: true, |
| 190 | IsCA: false, |
| 191 | Subject: pkix.Name{ |
| 192 | CommonName: host, |
| 193 | }, |
| 194 | DNSNames: altDNSNames, |
| 195 | } |
| 196 | |
| 197 | leafTemplate.KeyUsage = x509.KeyUsageDigitalSignature | x509.KeyUsageKeyAgreement |
| 198 | switch usage { |
| 199 | case CertTypeClient: |
| 200 | leafTemplate.ExtKeyUsage = []x509.ExtKeyUsage{x509.ExtKeyUsageClientAuth} |
| 201 | |
| 202 | case CertTypeServer: |
| 203 | leafTemplate.ExtKeyUsage = []x509.ExtKeyUsage{x509.ExtKeyUsageServerAuth} |
| 204 | leafTemplate.KeyUsage |= x509.KeyUsageKeyEncipherment |
| 205 | |
| 206 | hosts := strings.Split(host, ",") |
| 207 | for _, h := range hosts { |
| 208 | if ip := net.ParseIP(h); ip != nil { |
| 209 | leafTemplate.IPAddresses = append(leafTemplate.IPAddresses, ip) |
| 210 | continue |
| 211 | } |
| 212 | if !slices.Contains(leafTemplate.DNSNames, h) { |
no test coverage detected