2017-03-09 83 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