我有一个向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发出请求会给我“错误证书”错误。如何使客户端和服务器使用相同的证书?
答案 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()
方法启动测试服务器然后,您的程序应该能够使用这些证书调用测试服务器。