2014-08-30 127 views
3

所以,這裏我試圖讓套接字偵聽SSL連接。但是,它無法進行握手。運行時golang SSL認證

sudo openssl s_client -CApath /etc/ssl/certs/ -connect localhost:8080 

它無法驗證第一個證書。

我對這些SSL很少有經驗。誰能幫忙?

cert, err := tls.LoadX509KeyPair("positivessl.crt", "key.pem") 
    Error.CheckError(err)               

    rootCert, err := ioutil.ReadFile("AddTrustExternalCARoot.crt") 
    checkError(err)               
    trustCert, err := ioutil.ReadFile("COMODORSAAddTrustCA.crt")   
    checkError(err)               
    validationCert, err := ioutil.ReadFile("COMODORSADomainValidationSecureServerCA.crt") 
    checkError(err)               

    certs := x509.NewCertPool()             
    certs.AppendCertsFromPEM(validationCert)          
    certs.AppendCertsFromPEM(trustCert)           
    certs.AppendCertsFromPEM(rootCert)            

    sslConfig := tls.Config{RootCAs: certs,Certificates: []tls.Certificate{cert}} 
    sslConfig.Rand = rand.Reader                          

    listener, err := tls.Listen("tcp", service, &sslConfig) 
+0

您應該使用's_server',而不是's_client'作爲服務器。如果你使用's_client'作爲客戶端,那麼'sudo'沒有任何理由。 – jww 2014-08-30 08:12:38

回答

2

我不熟悉走本身,而是從文檔的http://golang.org/pkg/crypto/tls/他們類似於其他SSL堆棧:

  • rootCert不應該被包含在鏈中。根證書是用於客戶端證書鏈驗證的實際信任錨,因此客戶必須已經知道並信任它。
  • RootCA是用於驗證證書的可信證書。這些不會發送給對等實體,而是在驗證接收到的證書時用作信任錨。因此,此設置與客戶端驗證服務器證書相關,也可能在客戶端也發送證書時與服務器端驗證。
  • 相反,所有要發送給對等方的證書都必須包含在Certificates中。也就是說,不僅是葉證書cert,而且還有證書validationCerttrustCert。您必須以正確的順序包含它們,以便它們構建一個客戶端可以使用受信任的根證書完成的鏈。