2015-03-06 6 views
5

मैं एक गो टीसीपी सर्वर (http/s नहीं) बना रहा हूं और मैं SSL का उपयोग करने के लिए इसे कॉन्फ़िगर करने की कोशिश कर रहा हूं। मेरे पास एक StartCom मुफ्त SSL प्रमाणपत्र है जिसे मैं इसे पूरा करने के लिए उपयोग करने का प्रयास कर रहा हूं। मेरे सर्वर कोड इस तरह दिखता है:गोलांग एसएसएल टीसीपी सॉकेट प्रमाणपत्र कॉन्फ़िगरेशन

cert, err := tls.LoadX509KeyPair("example.com.pem", "example.com.key") 
    if err != nil { 
     fmt.Println("Error loading certificate. ",err) 
    } 
    trustCert, err := ioutil.ReadFile("sub.class1.server.ca.pem") 
    if err != nil { 
     fmt.Println("Error loading trust certificate. ",err) 
    } 
    validationCert, err := ioutil.ReadFile("ca.pem") 
    if err != nil { 
     fmt.Println("Error loading validation certificate. ",err) 
    } 
    certs := x509.NewCertPool() 
    if !certs.AppendCertsFromPEM(validationCert) { 
     fmt.Println("Error installing validation certificate.") 
    } 
    if !certs.AppendCertsFromPEM(trustCert) { 
     fmt.Println("Error installing trust certificate.") 
    } 

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

    service := ":5555" 
    tcpAddr, error := net.ResolveTCPAddr("tcp", service) 
    if error != nil { 
     fmt.Println("Error: Could not resolve address") 
    } else { 
     netListen, error := tls.Listen(tcpAddr.Network(), tcpAddr.String(), &sslConfig) 
     if error != nil { 
      fmt.Println(error) 
     } else { 
      defer netListen.Close() 

      for { 
       fmt.Println("Waiting for clients") 
       connection, error := netListen.Accept() 

मैं प्रमाणपत्र, कुछ प्रमाणपत्र, आदि लेकिन openssl s_client -CApath /etc/ssl/certs/ -connect localhost:5555 से उत्पादन सहित नहीं के आदेश के आसपास स्विचन की कोशिश की है अनिवार्य रूप से एक ही रहता है, verify error:num=20:unable to get local issuer certificate। पूर्ण आउटपुट के लिए here देखें। ऐसा लगता है कि मैं मध्यवर्ती प्रमाणपत्रों में कुछ गलत कर रहा हूं, लेकिन मुझे नहीं पता कि क्या। मैं कुछ दिनों के लिए इस पर काम कर रहा हूं, बहुत सारे गुगलिंग और सोइंग, लेकिन मेरी स्थिति में काफी कुछ नहीं लग रहा था। मैंने अपाचे और हैप्रोक्सी में कई प्रमाणपत्र स्थापित किए हैं, लेकिन यह वास्तव में मुझे स्टंप कर दिया गया है।

+0

अपने त्रुटि मान के रूप में 'त्रुटि' का उपयोग न करें, क्योंकि यह अंतर्निहित इंटरफ़ेस नाम मास्क करता है। – JimB

+0

धन्यवाद, मैं इसे सही कर दूंगा! –

उत्तर

4

RootCAs फ़ील्ड सर्वर प्रमाण पत्र सत्यापित करने वाले क्लाइंट के लिए है। मुझे लगता है कि आप केवल सत्यापन के लिए प्रमाण प्रस्तुत करना चाहते हैं, इसलिए आपको जो कुछ भी चाहिए उसे Certificates स्लाइस में लोड किया जाना चाहिए।

यहाँ एक न्यूनतम उदाहरण है:

cert, err := tls.LoadX509KeyPair("example.com.pem", "example.com.key") 
if err != nil { 
    log.Fatal("Error loading certificate. ", err) 
} 

tlsCfg := &tls.Config{Certificates: []tls.Certificate{cert}} 

listener, err := tls.Listen("tcp4", "127.0.0.1:5555", tlsCfg) 
if err != nil { 
    log.Fatal(err) 
} 
defer listener.Close() 

for { 
    log.Println("Waiting for clients") 
    conn, err := listener.Accept() 
    if err != nil { 
     log.Fatal(err) 
    } 
    go handle(conn) 
} 

भले ही आप HTTPS का उपयोग नहीं कर रहे, यह अभी भी http.ListenAndServeTLS पर शुरू सर्वर सेटअप के माध्यम से चलने के लिए उपयोगी हो सकता है।

+0

क्या इंटरमीडिएट सर्टिफिकेट example.com.pem फ़ाइल में जोड़ा जाना चाहिए? तो यह मुख्य प्रमाणपत्र के साथ भरा हुआ है? –

+0

@kkhugs: मेरे पास एक इंटरमीडिएट आसान काम करने वाला प्रमाण नहीं है, लेकिन मुझे काफी यकीन है कि आपको उन्हें अपने 'example.com.pem' में ले जाना चाहिए, जैसे कि आप nginx में उदाहरण के लिए (दस्तावेज़ कहते हैं' प्रमाणपत्र शामिल हैं एक या अधिक प्रमाणपत्र श्रृंखला ')। – JimB

+0

धन्यवाद, इंटरमीडिएट को प्रमाण फ़ाइल में जोड़ना और सुझाए गए अनुसार पूरी तरह से काम किया! –

संबंधित मुद्दे