由NewTLSServer创建的服务器可以验证从它显式创建的客户端的调用:
ts := httptest.NewTLSServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
fmt.Fprintln(w, "Hello, client")
}))
defer ts.Close()
client := ts.Client()
res, err := client.Get(ts.URL)
在线client := ts.Client()
中。
但是,我有一个生产程序,我想设置为使用ts.URL
作为其主机。
x509: certificate signed by unknown authority
错误的时候我叫它。
如何设置ts
,使其像普通HTTPS服务器一样对客户端进行身份验证?
2条答案
按热度按时间tktrz96b1#
从Go 1.11开始,由于HTTPS的机制,这根本不可能在
_test.go
程序中完全完成。但是,您可以对
server.crt
和server.key
文件进行单个证书签名和生成,然后在本地目录的_test.go
程序中无限期地引用它们。一次性生成
.crt
和.key
这是Daksh Shah的Medium文章How to get HTTPS working on your local development environment in 5 minutes中指定的步骤的简化版本,将在Mac上工作。
在您希望保存
server.crt
和server.key
文件的目录中,创建两个配置文件server.csr.cnf
和
一米九一
然后在该目录中输入以下命令
最后,通过运行以下命令使系统信任用于签署文件的证书
这应该会在Keychain Acces应用中打开证书,在 Certificates 部分可以找到,名为
localhost
。然后进行Always Trust**注意:**我在命令行中尝试了许多
security add-trusted-cert
的排列,尽管它将证书添加到密钥链并将其标记为“Always Trust”,但我的Go程序就是不信任它。只有GUI方法将系统置于我的Go程序将信任证书的状态。任何使用HTTPS在本地运行的Go程序现在都将信任使用
server.crt
和server.key
运行的服务器。运行服务器
您可以创建使用这些凭据的
*httptest.Server
示例以下是一个示例用法:
iyr7buue2#
httptest.Server
创建一个自签名证书,可将该证书提供给http.Client
,以便能够正确验证SSL证书。由于证书通常绑定到服务器的主机名,因此这可能是在测试中使用SSL的更好方法。
示例如下:
1.设置测试服务器:
2a.快速客户端,但不太灵活:
2b.通用客户端
1.使用客户端:
如果你真的 * 必须 * 使用自己的证书,你应该能够创建一个测试服务器而不启动它,设置
tls.Config
并启动服务器。