单元测试TLS客户端

时间:2018-07-24 04:03:09

标签: unit-testing go https client

我有一个向TLS服务器发出https请求的功能。我想编写单元测试来测试客户端功能。我遇到了可用于模拟服务器的httptest.NewTLSServer。但是,如何合并客户端使用的证书而不是NewTLSServer中使用的默认证书?

以下是发出请求的客户端功能:

func MakeDownloadRequest(url string) (*http.Response, error) {

    caCert, err := ioutil.ReadFile("client/tlscerts/cert.pem")
    if err != nil {
        return nil, err
    }
    caCertPool := x509.NewCertPool()
    caCertPool.AppendCertsFromPEM(caCert)

    cert, err := tls.LoadX509KeyPair("client/tlscerts/cert.pem","client/tlscerts/key.pem")
    if err != nil {
        return nil, err
    }

    client := &http.Client{
        Transport: &http.Transport{
            TLSClientConfig: &tls.Config{
                RootCAs:      caCertPool,
                Certificates: []tls.Certificate{cert},
            },
        },
    }

    resp, err := client.Get(url)
    if err != nil {
        return nil, err
    }
    return resp, nil
}

服务器存根:

server := httptest.NewTLSServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
        io.WriteString(w, "Hello")
    }))

使用server.URL发出请求会给我“错误证书”错误。如何使客户端和服务器使用相同的证书?

1 个答案:

答案 0 :(得分:2)

您要使用 var dat = new DataSet("Set1"); var tab = new DataTable("Tab1"); tab.Columns.Add(new DataColumn("Col1", typeof(int))); dat.Tables.Add(tab); tab.Rows.Add(123); var changes = dat.GetChanges(); dat.Merge(changes); dat.AcceptChanges(); Console.WriteLine("Row status is: {0}", tab.Rows[0].RowState); // Unchanged // Setting the same value will flag the Row "modified" tab.Rows[0]["Col1"] = tab.Rows[0]["Col1"]; tab.Rows[0].AcceptChanges(); if (dat.HasChanges()) // Actual Value: True, Expected Value: False { Console.WriteLine("Row status is: {0}", tab.Rows[0].RowState); // Actual Value: Modified, Expected Value: Unchanged } 而不是:

  • 通过httptest.NewUnstartedServer()
  • 创建测试服务器
  • 与在NewTLSServer()中设置*tls.Config的代码中创建代码一样,创建一个http.Client
  • 将测试服务器的TLS字段设置为上一步中创建的MakeDownloadRequest()
  • 使用其StartTLS()方法启动测试服务器

然后,您的程序应该能够使用这些证书调用测试服务器。