Skip to content

Instantly share code, notes, and snippets.

@Integralist
Last active October 17, 2025 13:34
Show Gist options
  • Select an option

  • Save Integralist/6aad6e8d1aade5674dbe6c63e089acb0 to your computer and use it in GitHub Desktop.

Select an option

Save Integralist/6aad6e8d1aade5674dbe6c63e089acb0 to your computer and use it in GitHub Desktop.

Revisions

  1. Integralist revised this gist Oct 17, 2025. 1 changed file with 1 addition and 0 deletions.
    1 change: 1 addition & 0 deletions main.go
    Original file line number Diff line number Diff line change
    @@ -1,3 +1,4 @@
    // https://go.dev/play/p/nDnCcCkMlFj
    package main

    import (
  2. Integralist created this gist Oct 17, 2025.
    68 changes: 68 additions & 0 deletions main.go
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,68 @@
    package main

    import (
    "crypto/ecdsa"
    "crypto/elliptic"
    "crypto/rand"
    "crypto/x509"
    "encoding/pem"
    "fmt"
    "log"
    )

    func main() {
    var sanList = []string{"www.example.com", "api.example.com"}

    csr, cr, err := GenerateCSR(sanList)
    if err != nil {
    log.Fatal(err)
    }

    fmt.Printf("CSR:\n%s\n", csr)
    fmt.Printf("Certificate Request:\n%#v\n", cr)
    }

    // GenerateCSR creates the relevant items to produce a CSR.
    // NOTE: This can be replaced once in Elevation with calls to Fastly services.
    func GenerateCSR(sanList []string) ([]byte, *x509.CertificateRequest, error) {
    certPrivateKey, err := ecdsa.GenerateKey(elliptic.P256(), rand.Reader)
    if err != nil {
    return nil, nil, fmt.Errorf("failed to generate private key for CSR: %w", err)
    }

    // WARNING: The following is for printing the private key.
    // It is for testing purposes only.

    privateKeyBytes, err := x509.MarshalECPrivateKey(certPrivateKey)
    if err != nil {
    return nil, nil, fmt.Errorf("failed to marshal private key for CSR: %w", err)
    }
    privateKeyPEM := pem.EncodeToMemory(&pem.Block{
    Type: "EC PRIVATE KEY",
    Bytes: privateKeyBytes,
    })
    fmt.Println("Private Key:")
    fmt.Println(string(privateKeyPEM))

    dnsNames := make([]string, 0, len(sanList))
    for _, san := range sanList {
    dnsNames = append(dnsNames, san)
    }
    csrTemplate := &x509.CertificateRequest{DNSNames: dnsNames}
    csrDER, err := x509.CreateCertificateRequest(rand.Reader, csrTemplate, certPrivateKey)
    if err != nil {
    return nil, nil, fmt.Errorf("error to creating CSR for '%#v': %w", dnsNames, err)
    }

    p := pem.EncodeToMemory(&pem.Block{
    Type: "CERTIFICATE REQUEST", // Standard type for CSR PEM blocks
    Bytes: csrDER, // The DER-encoded CSR bytes
    })

    csr, err := x509.ParseCertificateRequest(csrDER)
    if err != nil {
    return nil, nil, fmt.Errorf("failed to parse CSR for '%#v': %w", dnsNames, err)
    }

    return p, csr, nil
    }