2017-03-09 41 views
1

我使用以下功能在Go中设置https服务器。如何验证Go中的RSA密钥长度?

err := http.ListenAndServeTLS(":8080", key, cert, nil) 
if err != nil { 
    log.Fatal("error...") 
} 

其中key和cert分别是自签密钥和证书文件。 我的问题是,为了安全起见,我需要验证它们的自签密钥的大小是2048位(或更多)。 我怎样才能安全,干净地检查这在Go?

+0

统计文件大小? – zerkms

+0

@zerkms:那看起来不对。如果有额外的PEM块,或者密钥和证书在同一个文件中怎么办? –

+0

长话短说我想得到类似于类似于执行 “openssl rsa -text -noout -in key.pem”的输出,其中该命令的输出的第一行如下所示:“Private-Key:(1024位)“ – Jorch914

回答

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

请注意,这将因任何ECDSA密钥而失败,因为它们使用的密钥尺寸要小得多。 – JimB