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

时间:2018-06-18 15:06:59

标签: c++ ssl openssl qpid nss

我正在尝试使用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 ++客户端时,我不确定应该将哪个目录/证书名称作为环境变量?我尝试将目录作为${CERT_DIR}传递,将证书名称传递为${NICKNAME},但这似乎不起作用; QPID日志打印消息:

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

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

由于

1 个答案:

答案 0 :(得分:0)

这适用于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]

如果您还需要客户端身份验证,请传递标志--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,该API然后可以实例化与QPID代理的SSL连接。