QPID C++ 代理和 QPID-CPP SSL 证书

QPID C++ Broker and QPID-CPP SSL Certificates

我正在尝试使用 QPID 设置 SSL,但我在弄清楚如何设置证书时遇到了问题。我已经制作了一个证书数据库并向其中添加了一个自签名证书,如下所示:

mkdir ${CERT_DIR}
certutil -N -d ${CERT_DIR} -f ${CERT_PW_FILE}
certutil -S -d ${CERT_DIR} -n ${NICKNAME} -s "CN=${NICKNAME}" -t "CT,," -x -f ${CERT_PW_FILE} -z /usr/bin/certutil

然后我启动了 QPID C++ Broker,将 ${CERT_DIR}${NICKNAME}${CERT_PW_FILE} 传递给它。代理日志告诉我 SSL 侦听器在我选择的端口上 运行。

但是,我不确定在启动 QPID-CPP C++ 客户端时我应该给什么 directory/certificate 名称作为环境变量?我尝试将目录作为 ${CERT_DIR} 传递,将证书名称作为 ${NICKNAME} 传递,但这似乎不起作用; QPID 日志打印消息:

**[System] error Error reading socket: SSL peer cannot verify your certificate [-12271].**

设置用于 QPID 的服务器和客户端证书的正确步骤是什么?它说必须使用 certutil.

来完成

谢谢

这适用于 API 的 QPID Proton 0.23.0 和 C++ Broker 的 QPID CPP 1.38.0。

文本包含在 斜体 是给需要客户端认证的人。

我想出了如何使用自签名证书:

  1. 生成证书数据库:certutil -N -d [db-directory].
  2. 生成 CA 证书:certutil -S -s "CN=[ca-name]" -n [ca-name] -x -t "CTu,CTu,CTu" -1 -2 -5 -k rsa -d [db-directory]
  3. 生成服务器证书:certutil -S -s "CN=[server-cert-name]" -n [server-cert-name] -c "[ca-name]" -t "u,u,u" -m [unique-serial-no] -d [db-directory]
  4. 同理生成客户端证书:certutil -S -s "CN=[client-cert-name]" -n [client-cert-name] -c "[ca-name]" -t "u,u,u" -m [unique-serial-no] -d [db-directory].

这会生成包含所需证书的证书数据库。将用于创建证书数据库的密码存储在文件 [password-file] 中。然后可以像这样启动 QPID C++ Broker:

[path-to-qpidd] --ssl-cert-password-file [password-file] --ssl-cert-db [db-directory] --ssl-cert-name [server-cert-name]

如果你还需要客户端认证,传递flag --ssl-require-client-authentication.

为了使用 QPID Proton C++ 客户端通过 SSL 连接,我们必须将我们的服务器证书导出为 .pem 文件 并将我们的客户端证书导出为 cert.pem 和 key.pem 文件:

  1. 将我们的服务器和客户端证书导出为 .p12 文件:pk12util -o [client/server].p12 -d [db-directory] -n [client-cert-name/server-cert-name]
  2. 将服务器证书导出为 .pem 文件:openssl pkcs12 -in server.p12 -out server.pem -nodes
  3. 将客户端证书导出为证书和密钥 .pem 文件:
    • 证书:openssl pkcs12 -in client.p12 -clcerts -nokeys -out clientcert.pem.
    • 键:openssl pkcs12 -in client.p12 -nocerts -out clientkey.pem.

然后可以将这些文件传递给 QPID Proton C++ API,后者将能够实例化与 QPID 代理的 SSL 连接。