2017-03-09 5 views
1

次の機能を使用して、Goにhttpsサーバーを設定しています。GoでRSA鍵の長さを確認する方法は?

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

ここで、keyとcertはそれぞれ自己署名キーと証明書ファイルです。 私の問題は、セキュリティのために、2048ビット(またはそれ以上)のサイズを持つために自己署名キーを検証する必要があるということです。 Goでこれを安全かつきれいにチェックできますか?

+0

Statファイルサイズ? – zerkms

+0

@zerkms:それは正しいとは思わない。余分なPEMブロックがある場合、またはキーと証明書が同じファイルにある場合はどうなりますか? –

+0

長文短く私は"openssl rsa -text -noout -in key.pem"を実行したときの出力のように、このコマンドの出力の最初の行が "Private-Key:1024 bit) " – 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

関連する問題