我正在尝试与我公司的某些软件进行通信(我没有写过)。我们可以通过配置设置服务器证书,服务器密钥和服务器CA证书。
我在主机上生成根证书:
openssl genrsa -out rootCA.key 2048
我使用以下方式对根证书进行自签名:
openssl req -x509 -new -nodes -key rootCA.key -sha256 -days 1024 -out rootCA.pem
我生成客户端密钥与使用根密钥相同,生成CSR:
openssl req -new -key device.key -out device.csr
然后我使用根证书签署客户端密钥:
openssl x509 -req -in device.csr -CA rootCA.pem -CAkey rootCA.key -CAcreateserial -out device.crt -days 500 -sha256
我正在从Python OpenSSL到这个应用程序(用Java运行)进行通信。我将OpenSSL中的密钥和证书文件设置为设备密钥,然后将server-ca-cert和server-cert设置为根证书,将server-key设置为根密钥。无论如何,我总是在Python中得到这个错误:
OpenSSL.SSL.Error: [('SSL routines', 'SSL3_GET_SERVER_CERTIFICATE', 'certificate verify failed')]
Java中的这个错误:
On handshake complete OpenSSL error: error:14094418:SSL routines:SSL3_READ_BYTES:tlsv1 alert unknown ca
我不知道我做错了什么,或者是否是我没有得到的软件 - 在我去讨论CTO之前,我想知道我是否理解SSL / TLS。我错过了一步吗?服务器是否应该使用根证书作为自己的证书?
修改
更多地解释设置:
我们通常在群集环境中部署。
客户端应用程序在主/备用配置中的两台计算机上运行,服务器是群集中的所有计算机(包括两个主/备用网络集成单元)。作为我们安装过程的一部分,主机将根SSH密钥分发给集群中的所有计算机 - 因此,通过Ansible,我可以完全控制所有计算机。这两个NIU有一个应用程序,它使用SOAP over TLS来控制集群中所有机器上的软件。我们历来使用UDP,但我们正在努力提高安全性。