2017-05-06 3 views
0

Ich versuche, gRPC Verbindung mit gegenseitigen TLS nach der Anleitung in diesem Blog Secure gRPC with TLS/SSL zu erstellen, aber ich möchte nicht das Zertifikat erstellen und speichern Sie es in eine Datei auf der Festplatte, ich möchte der Dienst selbst seine Schlüssel erstellen, dann wird der certificate authority key woanders hingebracht (ich plane den google pki als ca).Golang, kann ich X509KeyPair mit RSA-Schlüssel erstellen?

Was ich bisher gemacht habe Ich kann das private/public Schlüsselpaar mit RSA erstellen, dann den öffentlichen Schlüssel zu PEM-Schlüssel codieren, der hier einen Code folgt Golang : Generate DSA private, public key and PEM files example jetzt bin ich auf, wie das Zertifikat mit der LoadX509KeyPair erstellen. Ich weiß nicht, wo der Wert für den zweiten Parameter abgerufen werden soll, er benötigt keyPemBlock in Bytes, aber der private RSA-Schlüssel ist nicht in Byte.

Ich möchte fragen, gibt es eine viel bessere Möglichkeit, ein Zertifikat mit der RSA zu erstellen, wenn es möglich ist?

Und auch wenn wir ein Zertifikat mit RSA erstellen können; benutze die unvollständige Lösung von mir oben, wo ich den Wert für den zweiten Parameter der tls.LoadX509KeyPair bekommen kann?

Danke

Antwort

0

Wenn Sie Ihr eigenes Zertifikat und einen privaten Schlüssel zu generieren, müssen Sie tun:

1.- privaten Schlüssel generieren:

key, err := rsa.GenerateKey(rand.Reader, 2048) 
if err != nil { 
    log.Fatal("Private key cannot be created.", err.Error()) 
} 

// Generate a pem block with the private key 
keyPem := pem.EncodeToMemory(&pem.Block{ 
    Type: "RSA PRIVATE KEY", 
    Bytes: x509.MarshalPKCS1PrivateKey(key), 
}) 

2.- Generieren der Zertifikat:

tml := x509.Certificate{ 
    // you can add any attr that you need 
    NotBefore: time.Now(), 
    NotAfter:  time.Now().AddDate(5, 0, 0), 
    // you have to generate a different serial number each execution 
    SerialNumber: big.NewInt(123123), 
    Subject: pkix.Name{ 
     CommonName: "New Name", 
     Organization: []string{"New Org."}, 
    }, 
    BasicConstraintsValid: true, 
} 
cert, err := x509.CreateCertificate(rand.Reader, &tml, &tml, &key.PublicKey, key) 
if err != nil { 
    log.Fatal("Certificate cannot be created.", err.Error()) 
} 

// Generate a pem block with the certificate 
certPem := pem.EncodeToMemory(&pem.Block{ 
    Type: "CERTIFICATE", 
    Bytes: cert, 
}) 

3.- Zertifikat laden/privates Schlüsselpaar:

tlsCert, err := tls.X509KeyPair(certPem, keyPem) 
if err != nil { 
    log.Fatal("Cannot be loaded the certificate.", err.Error()) 
} 

4.- Verwenden Sie die tlsCert für was auch immer Sie wollen, ex:

l, err := tls.Listen("tcp", ":8080", &tls.Config{ 
    Certificates: []tls.Certificate{tlsCert}, 
}) 
+0

dank viel, ich war für ein paar Minuten zu spät Lösung posten besitzen kann. Meine Lösung ist dir sehr ähnlich. Als Referenz, ich graben diese up https://golang.org/src/crypto/tls/generate_cert.go, das ist auch ein gutes Beispiel und meine Lösung basiert auf diesem Link. – zer09

Verwandte Themen