当前位置: 首页 > 知识库问答 >
问题:

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

金晗日
2023-03-14

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服务器一样?

共有1个答案

赫连坚
2023-03-14

从Go 1.11开始,这根本不可能在\u测试中完全实现。由于HTTPS的机制,转到程序。

但是,您可以执行单个证书签名并生成服务器。crt和服务器。键入文件,然后在测试中引用它们。无限期地从本地目录转到程序。

这是Daksh Shah的媒体文章《如何在5分钟内让HTTPS在本地开发环境中工作》中指定的步骤的一个略作简化的版本,该文章将在Mac上工作。

在您想要服务器的目录中。crt和服务器。键文件,创建两个配置文件

[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

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应用程序中打开证书,在证书部分中找到证书,并命名为localhost。然后永远相信它

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

注意:我从命令行尝试了许多安全添加可信证书的排列,尽管它将证书添加到密钥链并将其标记为“始终信任”,但我的Go程序不会信任它。只有GUI方法将系统置于我的Go程序信任证书的状态。

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

您可以创建*httptest。使用这些凭据的服务器实例

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))
}

 类似资料:
  • 问题内容: 这是一个设计问题。我有需要进入HTML表的数据,稍后将由用户操纵。基本上,用户将能够选择表格行中的项目。 我有两个选择-在两种情况下,我都使用AJAX来获取数据: 在服务器端使用PHP创建HTML代码,并将其作为HTML发送到客户端。然后,用户使用Javascript(本质上是jQuery)来操纵表格。 使用JSON将原始数据发送到客户端,然后使用jQuery创建HTML,然后由用户对

  • 我已经在Go中编写了一个简单的客户机/服务器,它将通过TLS执行HTTP GET,但我也试图使它能够通过TLS执行HTTP POST。 我现在也没有什么东西可以在服务器端处理这个帖子,但我只想让它把它打印到屏幕上,这样当我运行客户端时,我就会看到服务器打印。 我应该如何修复我的客户端代码来做一个适当的帖子?而相应的服务器代码应该是什么样子才能接受POST呢?任何帮助都将非常感谢,我有困难找到HTT

  • 如何使用JAX-RS Client Fluent API为外部世界REST服务创建rest客户端? 例如,假设一个服务返回一个person对象,该对象有两个字段名和年龄。 无论我遇到什么样的例子/教程,他们做同样的事情,下面的片段或他们开发客户端在同一个项目,以取代tring.classperson.class.我应该如何创建独立的客户端,将返回我pojo的人。

  • 关于Netflix Eureka Service Registry,我已经成功地使用Tomcat8.0.35设置了Eureka Netflix服务器。我还得到了基本的示例服务&客户端来进行相互通信。我对Eureka还是个新手,管理层决定将Eureka与Spring一起使用,因为几个新的应用程序都是围绕Spring框架编写的。 null 我希望为大多数非AWS云实例配置服务和客户端。Eureka W

  • 我是java和web服务以及的新手。我最近使用一些教程创建了一个web服务。当我第一次学习eclipse教程时,让我创建一个客户机。但是当我尝试创建一个新项目和一个新的web服务客户机时,它会给出。具体如下所示: im使用Axis2-1.6.1,它说java遵从性级别是6,我搜索了一下,但是找不到解决这个问题的相关方案。感谢任何帮助。

  • 我想在一些计算机之间建立点对点连接,这样用户就可以在没有外部服务器的情况下聊天和交换文件。我最初的想法如下: 我在服务器上制作了一个中央服务器插座,所有应用程序都可以连接到该插座。此ServerSocket跟踪已连接的套接字(客户端),并将新连接的客户端的IP和端口提供给所有其他客户端。每个客户端都会创建一个新的ServerSocket,所有客户端都可以连接到它。 换句话说:每个客户端都有一个Se