为任何客户端创建 HTTPS 测试服务器

Chr*_*ord 4 go

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)
Run Code Online (Sandbox Code Playgroud)

在行中client := ts.Client()

但是,我有一个生产程序,我想将它设置ts.URL为它的主机。我正进入(状态

x509: certificate signed by unknown authority
Run Code Online (Sandbox Code Playgroud)

当我调用它时出错。

如何设置ts像普通 HTTPS 服务器一样向客户端进行身份验证?

Chr*_*ord 6

从 Go 1.11 开始,这根本不可能在一个 _test.go由于 HTTPS 的机制程序中。

但是,你可以做一个单一的证书签名和生成server.crtserver.key文件,然后在引用它们的_test.go从本地目录程序无限期。

一次性.crt.key一代

这是 Daksh Shah 的 Medium 文章《如何在 5 分钟内使 HTTPS 在本地开发环境中正常工作》中指定步骤的节略、稍微简化的版本Mac 上运行。

在你想要你的server.crtserver.key文件的目录中,创建两个配置文件

server.csr.cnf

[req]
default_bits = 2048
prompt = no
default_md = sha256
distinguished_name = dn

[dn]
C=US
ST=RandomState
L=RandomCity
O=RandomOrganization
OU=RandomOrganizationUnit
emailAddress=hello@example.com
CN = localhost
Run Code Online (Sandbox Code Playgroud)

v3.ext

authorityKeyIdentifier=keyid,issuer
basicConstraints=CA:FALSE
keyUsage = digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment
subjectAltName = @alt_names

[alt_names]
DNS.1 = localhost
IP.1 = 127.0.0.1
Run Code Online (Sandbox Code Playgroud)

然后在该目录下输入以下命令

[req]
default_bits = 2048
prompt = no
default_md = sha256
distinguished_name = dn

[dn]
C=US
ST=RandomState
L=RandomCity
O=RandomOrganization
OU=RandomOrganizationUnit
emailAddress=hello@example.com
CN = localhost
Run Code Online (Sandbox Code Playgroud)
authorityKeyIdentifier=keyid,issuer
basicConstraints=CA:FALSE
keyUsage = digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment
subjectAltName = @alt_names

[alt_names]
DNS.1 = localhost
IP.1 = 127.0.0.1
Run Code Online (Sandbox Code Playgroud)
openssl genrsa -des3 -out rootCA.key 2048 
# create a passphrase
Run Code Online (Sandbox Code Playgroud)
openssl req -x509 -new -nodes -key rootCA.key -sha256 -days 1024 -out rootCA.pem -config server.csr.cnf
# enter passphrase
Run Code Online (Sandbox Code Playgroud)

最后,通过运行使您的系统信任您用于签署文件的证书

openssl req -new -sha256 -nodes -out server.csr -newkey rsa:2048 -keyout server.key -config server.csr.cnf
Run Code Online (Sandbox Code Playgroud)

这应该会在 Keychain Access 应用程序中打开证书,该证书将在Certificates部分中找到并命名为localhost。然后永远相信

  • 按回车键打开它的窗口
  • 按空间旋转信任
  • 将“使用此证书时:”更改为始终信任
  • 关闭窗口并验证您的决定

注意:我已经尝试了很多排列security add-trusted-cert从命令行,尽管它将证书添加到钥匙串并将其标记为“始终信任”,但我的 Go 程序不会信任它。只有 GUI 方法将系统置于我的 Go 程序将信任该证书的状态。

您使用 HTTPS 在本地运行的任何 Go 程序现在将信任您使用的服务器,server.crt并且server.key

运行服务器

您可以创建*httptest.Server使用这些凭据的实例

openssl x509 -req -in server.csr -CA rootCA.pem -CAkey rootCA.key -CAcreateserial -out server.crt -days 500 -sha256 -extfile v3.ext
# enter passphrase
Run Code Online (Sandbox Code Playgroud)

这是一个示例用法:

open rootCA.pem
Run Code Online (Sandbox Code Playgroud)