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

길고 짧은 이야기 나는이 명령의 출력의 첫 번째 행이 "Private-Key : 1024 (1024)"와 같은 내용의"openssl rsa -text -noout -in key.pem" 비트) " – 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