当前位置: 首页 > 面试题库 >

Golang SSL TCP套接字证书配置

壤驷德宇
2023-03-14
问题内容

我正在创建一个Go TCP服务器(不是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。有关完整输出,请参见此处。我对中间证书似乎做错了,但是我不知道该怎么办。我已经为此工作了几天,进行了大量的谷歌搜索和搜索,但似乎没有什么适合我的情况。我已经在Apache和HAProxy中设置了许多证书,但这确实使我感到困惑。


问题答案:

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



 类似资料:
  • 问题内容: 让我快速解释一下我要做什么。我正在尝试用Java构建自己的Apple的Push Notification服务(出于测试目的)。此服务的工作归功于TLS套接字。 我有一个Java客户端来创建TLS套接字,以将推送通知发送到APN。我更改了主机URL,以将套接字重定向到localhost:2195。现在,我试图编写一个Java套接字服务器来获取通知请求。 但是,握手过程中出现异常,找不到解

  • 主要内容:1 Tomcat生成SSL证书,2 使用SSL证书1 Tomcat生成SSL证书 运行以下命令以生成证书: 在Windows上: 在Linux上: 该工具将询问一些问题以提供证书。证书将位于文件夹中,证书名称为"tomcat"。您可以使用以下方法检查证书: 在Windows上: 在Linux上: 2 使用SSL证书 编辑文件: 在Windows上: 在Linux上: 并添加一个SSL连接器。 重新启动Tomcat,您就完成了。现在,您可以在Tom

  • 数字证书 数字证书用来证明某个公钥是谁的,并且内容是正确的。 对于非对称加密算法和数字签名来说,很重要的一点就是公钥的分发。一旦公钥被人替换(典型的如中间人攻击),则整个安全体系将被破坏掉。 怎么确保一个公钥确实是某个人的原始公钥? 这就需要数字证书机制。 顾名思义,数字证书就是像一个证书一样,证明信息和合法性。由证书认证机构(Certification Authority,CA)来签发,权威的

  • 问题内容: 在我们的iOS项目中,我们将用于生成AdHoc和AppStore构建的签名证书和供应配置文件都提交给版本控制存储库。这样,每当新开发人员下载该应用程序的新副本时,他就拥有了为测试人员创建AdHoc构建所需的一切。 我们正在使用Jenkins进行持续集成,我希望有一个脚本可以对提交的文件进行完整性检查。特别是,我想检查提交的配置文件是否确实是使用在存储库中提交的签名证书生成的。 有谁知道

  • 问题内容: 我在通过Java与HTTPS站点交互时遇到问题。每次程序运行时,我的程序都使用一个带有不受信任证书的URL。该程序必须在多个系统上运行。目前,我有以下内容: 使用此代码,我可以执行以下操作: 但是,我无法执行以下操作: 当执行executeMethod(postMethod)时,我得到一个SSLHandshakeException,CertPathBuilderException等。

  • 问题内容: 如何验证socket.io连接?我的应用程序使用来自另一台服务器(python)的登录端点来获取令牌,每当用户在节点侧打开套接字连接时如何使用该令牌? 和客户端: 如果令牌是在python中创建的: 如何使用此令牌对节点中的套接字连接进行身份验证? 问题答案: 令牌是否在另一台服务器上创建都没有关系。如果您拥有正确的密钥和算法,您仍然可以验证它。 用模块实施 客户 服务器 用模块实施