2017-03-09 4 views
1

Je configure un serveur https dans Go en utilisant la fonction suivante. Où key et cert sont des fichiers de clé et de certificat auto-signés respectivement. Mon problème est que pour la sécurité, j'ai besoin de valider la clé auto-signée pour avoir une taille de 2048 bits (ou plus). Comment puis-je vérifier de manière sécurisée et propre dans Go?Comment vérifier la longueur de clé RSA dans Go?

+0

Quelle est la taille du fichier? – zerkms

+0

@zerkms: cela ne semble pas correct. Et s'il y a des blocs PEM supplémentaires, ou si la clé et le cert sont dans le même fichier? –

+0

Longue histoire courte Je veux obtenir quelque chose de similaire à la sortie de l'exécution "openssl rsa -text -noout -in key.pem" pour lequel la première ligne de la sortie de cette commande est comme ceci "Private-Key: (1024 bit) " – Jorch914

Répondre

2
package main 

import (
    "crypto/ecdsa" 
    "crypto/rsa" 
    "crypto/tls" 
    "log" 
    "net/http" 
) 

func main() { 
    certFile := "/tmp/cert.pem" 
    keyFile := "/tmp/key.pem" 

    cert, err := tls.LoadX509KeyPair(certFile, keyFile) 
    if err != nil { 
     log.Fatal(err) 
    } 

    var bitLen int 
    switch privKey := cert.PrivateKey.(type) { 
    case *rsa.PrivateKey: 
     bitLen = privKey.N.BitLen() 
    case *ecdsa.PrivateKey: 
     bitLen = privKey.Curve.Params().BitSize 
    default: 
     log.Fatal("unsupported private key") 
    } 

    if bitLen < 2048 { 
     log.Fatalf("private key length is too small (size: %d)\n", bitLen) 
    } 

    tlsConfig := tls.Config{ 
     Certificates: []tls.Certificate{cert}, 
    } 

    server := http.Server{ 
     Addr:  ":8080", 
     TLSConfig: &tlsConfig, 
    } 
    if err := server.ListenAndServeTLS("", ""); err != nil { 
     log.Fatal(err) 
    } 
} 
+2

Notez que cela échouera avec n'importe quelle clé ECDSA, car ils utilisent des tailles de clé beaucoup plus petites. – JimB