跳到主要内容

为REST配置双向SSL认证

本节向您展示如何使用自签名证书为 PubSub+ 事件代理中的 REST 配置双向 SSL 认证。步骤包括如何生成自签名证书、在事件代理实例中配置证书,以及验证 SSL 通信。

概览

单向 SSL/服务器证书认证

在单向 SSL 认证(服务器证书认证)中,仅客户端验证服务器;服务器不验证客户端应用。实施单向 SSL 认证时,服务器应用向客户端共享其公钥证书。

img

双向 SSL/客户端认证

在双向 SSL 认证中,客户端应用验证服务器应用的身份,然后服务器应用验证客户端应用的身份。双方共享各自的公钥证书,然后进行验证。双向 SSL 认证通过交换证书的相互握手实现。您还可以通过用户名或通用名称(Common Name)注入进行认证。

img

先决条件

  • 安装 OpenSSL 以生成自签名证书。
  • 安装 Postman 以测试客户端认证。
  • 通过 Solace CLI 创建 FTP 用户以传输文件。
  • 在事件代理中创建客户端用户名,该用户名被分配为客户端密钥文件的通用名称(CN)。

假设

  • 拥有配置 PubSub+ 事件代理中证书的管理员权限。
  • 具备 Solace CLI 的操作知识。

为REST配置双向SSL认证

要配置双向 SSL 认证,您需要使用 OpenSSL 生成自签名证书,在事件代理实例中配置证书,并使用 Postman 验证客户端认证。

第 1 步:生成 SSL 服务器证书

您可以使用以下方法生成自签名证书,或从您所在组织的证书颁发机构获取。

要生成自签名 SSL 服务器证书,请执行以下步骤:

  1. 为事件代理创建 TLS 密钥:

    openssl genrsa -des3 -out root.key 4096

    在提示符处输入密码。

  2. 创建服务器证书并生成签名请求:

    openssl req -new -x509 -days 1000 -key root.key -out server.pem -subj "/C=/ST=/L=/O=/OU=/CN=root"
  3. 通过连接私钥和服务器证书创建 pem 文件:

    cat root.key > server_cert.pem
    cat server.pem >> server_cert.pem
  4. 使用“SCP”服务将证书放置在 /usr/sw/jail/certs 目录中:

    scp -P2222 /home/<username>/server_cert.pem <Solace FTP User>@<Host>:/certs/

    确保通过 Solace CLI 创建 FTP 用户。

第 2 步:在事件代理上启用 SSL

要为事件代理上的 REST 启用 SSL,请执行以下操作:

  1. 登录到 Solace CLI。

  2. 为消息 VPN 启用 SSL:

    solace(configure)# message-vpn <vpn-name>
    solace(configure/message-vpn)# service rest
    solace(configure/message-vpn/service/rest)# incoming
    solace(...ure/message-vpn/service/rest/incoming)# listen-port 9443 ssl
    solace(...ure/message-vpn/service/rest/incoming)# no ssl shutdown

    您也可以使用 PubSub+ Broker Manager 启用 SSL。

  3. 设置您在第 1 步中创建的服务器证书供事件代理使用:

    solace(configure)# ssl
    solace(configure/ssl)# server-certificate <filename>

    其中:

    <filename> 是证书的文件名。该文件必须位于事件代理上的 /usr/sw/jail/certs 目录中。在此案例中,server_cert.pem 是证书的文件名。

    有关使用服务器证书的更多信息,请参阅设置要使用的服务器证书。

第 3 步:验证 SSL 上的 REST

  1. 使用 https 和 SSL 端口访问 URL:

    https://<host>:<9443>/
  2. 验证配置的证书是否已在浏览器中加载。

第 4 步:生成客户端特定证书

在此步骤中,我们根据根密钥和服务器证书生成客户端密钥和客户端 pem 文件。

  1. 创建客户端密钥和 csr 文件:

    openssl req -nodes -new -newkey rsa:4096 -keyout client.key -out client.csr -subj "/C=/ST=/L=/O=/OU=/CN=Client_User"

    在上述脚本中,Client_User 是 Solace 客户端用户名。

  2. 为 REST 客户端生成客户端 pem 文件和签名请求:

    openssl x509 -req -in client.csr -CA server.pem -CAkey root.key -CAcreateserial -out client.pem -days 1825 -sha256

    在第 1 步:生成 SSL 服务器证书中生成了 root.keyserver.pem 文件。

  3. 创建客户端证书 pem 文件:

    cat client.key > client_cert.pem
    cat client.pem >> client_cert.pem

第 5 步:在事件代理中配置 CA

在此步骤中,我们配置 CA 并为给定的消息 VPN 启用客户端证书认证。

  1. 创建证书颁发机构(CA)并分配上一步中创建的证书:

    solace> enable
    solace# configure
    solace(configure)# authentication
    solace(configure/authentication)# create certificate-authority <ca-name>
    solace(.../authentication/certificate-authority)# certificate file <ca-certificate>

    其中:

    <ca-name> 是 CA 的名称。您可以使用最多 64 个字符为 ca-name。可接受的字符是字母数字字符、句点(.)、连字符(-)和下划线(_)。

    <ca-certificate> 是 CA 证书的文件名。该文件必须位于事件代理上的 /usr/sw/jail/certs 目录中。在此案例中,server.pem 是 CA 证书。

    查看配置客户端认证证书颁发机构列表以获取额外配置和特定于事件代理版本的信息。

  2. 为消息 VPN 分配用户名源:

    solace(configure)# message-vpn <vpn-name>
    solace(configure/message-vpn)# authentication
    solace(configure/message-vpn/authentication)# client-certificate
    solace(...vpn/authentication/client-certificate)# username-source common-name
    solace(...vpn/authentication/client-certificate)# no shutdown

    在此案例中,Client_User 是我们用于认证的通用名称。

    有关用户名源的更多信息,请参阅客户端用户名源。

第 6 步:验证客户端认证

最后,我们使用 Postman(版本 7.14)执行客户端认证。

  1. 打开 Postman,导航至 Preferences 并点击 Certificates 以添加客户端证书。

  2. 如下例所示,提供主机、端口、client.pem 和 client.key 文件。

    img

    img

  3. 现在,您可以在浏览器中使用 No Auth 配置验证客户端认证(https://<host>:9443/TOPIC/test)。您应该能够在没有凭据的情况下发布消息,并获得 200 OK 响应。

    img

  4. 可选地,您还可以通过禁用 <Client_User> 并发布消息来执行负面验证。它应在 Postman 中显示“客户端用户名已关闭”的错误消息。

    确保默认用户已禁用。

为客户端连接配置双向SSL认证

要为客户端连接配置双向 SSL 认证,我们使用 OpenSSL 生成自签名证书,在客户端和代理中配置证书,并通过确保客户端和服务器在连接过程中相互认证对方的证书来验证安全通信。

第 1 步:生成和签名证书

以下步骤向您展示如何生成和签名建立双向 SSL 认证所需的证书,这确保了客户端和服务器之间的安全通信。

  1. 创建一个 4096 位 RSA 私钥,该私钥作为根密钥,用于签署服务器证书以进行安全通信。

    openssl genrsa -des3 -out root.key 4096
  2. 生成一个自签名服务器证书,有效期为 1000 天,使用根密钥并将其与特定 IP 地址关联:

    openssl req -new -x509 -days 1000 -key root.key -subj "/C=CA/CN=MyName" -addext "subjectAltName = IP:192.168.169.85" -out server.pem
  3. 创建一个新的客户端 RSA 密钥和证书签名请求(CSR),以请求服务器签署客户端证书:

    openssl req -nodes -new -newkey rsa:4096 -addext "subjectAltName = IP:192.168.169.85" -keyout client.key -out client.csr -subj "/C=/ST=/L=/O=/OU=/CN=MyName"
  4. 使用服务器证书签署客户端的 CSR。这验证了客户端证书,用于安全的双向认证:

    openssl x509 -req -in client.csr -CA server.pem -CAkey root.key -CAcreateserial -out client.pem -days 1825 -sha256

第 2 步:管理密钥库

在生成和签署证书后,您现在可以管理密钥库,该密钥库安全地存储 SSL 握手期间客户端认证所需的证书和密钥。

  1. 将服务器的私钥和证书合并为一个服务器证书文件,事件代理使用该文件向客户端认证自身:

    cat root.key > server_cert.pem
    cat server.pem >> server_cert.pem
  2. 创建一个新的密钥库,并使用密码保护,以安全地存储证书并管理客户端认证所需的密钥:

    keytool -genkeypair -alias boguscert -storepass MyName -keypass MyName -keystore mqtt.keystore -dname "CN=Developer, OU=Department, O=Company, L=City, ST=State, C=CA"
  3. 从密钥库中删除占位符证书,为实际的客户端证书做好准备:

    keytool -delete -alias boguscert -storepass MyName -keystore mqtt.keystore
  4. 将签署的客户端证书导入密钥库,以便在 SSL 握手期间认证客户端:

    keytool -import -alias MyName -file client.pem -keystore mqtt.keystore

    server_cert.pem 文件必须配置为事件代理上的服务器证书,而 server.pem 文件应配置为 client-certificate-authority

    您可以使用以下 sdkperf 命令测试配置。以下命令通过安全(SSL/TLS)连接连接到 MQTT 代理,使用客户端证书进行认证,并以每秒 40 条消息的速率异步地向指定主题发布消息:

    sdkperf_mqtt_trunk \
    -cip=mqtts://192.168.132.60:8883 \ # 使用指定的 IP 地址和端口通过 MQTT Secure (MQTTS) 连接到 MQTT 代理
    -mr=40 \ # 将消息速率设置为每秒 40 条消息
    -msa=1 \ # 以异步方式发送消息(msa=1 表示异步模式)
    -mn=100000000 \ # 将最大消息数设置为 1 亿
    -ptl=t00000001 \ # 使用主题 't00000001' 发布消息
    -mpq=1 \ # 将消息负载大小设置为 1 字节
    -as=client-certificate \ # 使用客户端证书认证
    -sslcf=client.pem \ # 指定 SSL/TLS 客户端证书文件(client.pem)
    -sslksp="myname" \ # 指定 SSL/TLS 密钥库密码(在此案例中为 'myname')
    -sslks=/home/mycomputer/mqtt.keystore # 指定密钥库文件位置

    # 完整命令(不含注释):
    sdkperf_mqtt_trunk \
    -cip=mqtts://192.168.132.60:8883 -mr=40 -msa=1 -mn=100000000 -ptl=t00000001 \
    -mpq=1 -as=client-certificate -sslcf=client.pem -sslksp="myname" -sslks=/home/mycomputer/mqtt.keystore