gpt4 book ai didi

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

转载 作者:IT王子 更新时间:2023-10-29 01:43:49 28 4
gpt4 key购买 nike

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 服务器一样向客户端进行身份验证?

最佳答案

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

但是,您可以执行单个证书签名并生成 server.crtserver.key 文件,然后在您的 _test.go< 中引用它们 无限期来自本地目录的程序。

一次性.crt.key生成

这是 Daksh Shah 的 Medium 文章 How to get HTTPS working on your local development environment in 5 minutes 中指定步骤的略微简化版本。 ,它可以在 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

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

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

openssl genrsa -des3 -out rootCA.key 2048 
# create a passphrase
openssl req -x509 -new -nodes -key rootCA.key -sha256 -days 1024 -out rootCA.pem -config server.csr.cnf
# enter passphrase
openssl req -new -sha256 -nodes -out server.csr -newkey rsa:2048 -keyout server.key -config server.csr.cnf
openssl x509 -req -in server.csr -CA rootCA.pem -CAkey rootCA.key -CAcreateserial -out server.crt -days 500 -sha256 -extfile v3.ext
# enter passphrase

最后,通过运行

让您的系统信任您用于签署文件的证书
open rootCA.pem

这应该会在 Keychain Acces 应用程序中打开证书,它位于 Certificates 部分并命名为 localhost。然后永远相信

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

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

您使用 HTTPS 在本地运行的任何 Go 程序现在都将信任您使用 server.crtserver.key 运行的服务器。

运行服务器

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

func NewLocalHTTPSTestServer(handler http.Handler) (*httptest.Server, error) {
ts := httptest.NewUnstartedServer(handler)
cert, err := tls.LoadX509KeyPair("server.crt", "server.key")
if err != nil {
return nil, err
}
ts.TLS = &tls.Config{Certificates: []tls.Certificate{cert}}
ts.StartTLS()
return ts, nil
}

这是一个用法示例:

func TestLocalHTTPSserver(t *testing.T) {
ts, err := NewLocalHTTPSTestServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
fmt.Fprint(w, "Hello, client")
}))
assert.Nil(t, err)
defer ts.Close()

res, err := http.Get(ts.URL)
assert.Nil(t, err)

greeting, err := ioutil.ReadAll(res.Body)
res.Body.Close()
assert.Nil(t, err)

assert.Equal(t, "Hello, client", string(greeting))
}

关于go - 为任何客户端创建 HTTPS 测试服务器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54899550/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com