我正在尝试使用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
完成。
由于
答案 0 :(得分:0)
这适用于API的QPID Proton 0.23.0和C ++ Broker的QPID CPP 1.38.0。
包含在 斜体 中的文本用于需要客户端身份验证的人。
我想出了如何使用自签名证书的方法:
certutil -N -d [db-directory]
。certutil -S -s "CN=[ca-name]" -n [ca-name] -x -t "CTu,CTu,CTu" -1 -2 -5 -k rsa -d [db-directory]
。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]
。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文件 :
pk12util -o [client/server].p12 -d [db-directory] -n [client-cert-name/server-cert-name]
。openssl pkcs12 -in server.p12 -out server.pem -nodes
。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连接。