Итак, я пытался установить SSL-соединение между клиентом Python и сервером Python, в котором оба имеют отдельные сертификаты для проверки друг друга, и оба сертификата подписаны одним CA (который также являетсякорневой CA).Это должно сделать их обоих действительными друг для друга, верно?
До сих пор моя методология заключалась в создании сценария bash, который делает все это:
- Он генерирует закрытый ключ дляКорневой CA
- Генерирует сертификат корневого СА, используя закрытый ключ корневого СА
- Генерирует закрытый ключ для сервера
- Генерирует CSR для сервера
- Генерирует серверный сертификат, используя CSR сервера и сертификат корневого CA
- Генерирует закрытый ключ для клиента
- Генерирует CSR для клиента
- Он генерирует сертификат клиента с использованием клиентского CSR и сертификата корневого центра сертификации
#!/bin/bash
BOLD=$(tput bold)
CLEAR=$(tput sgr0)
echo -e "${BOLD}Generating RSA AES-256 Private Key for Root Certificate Authority${CLEAR}"
openssl genrsa -aes256 -out Root.CA.example.llc.key 4096
echo -e "${BOLD}Generating Certificate for Root Certificate Authority${CLEAR}"
openssl req -x509 -new -nodes -key Root.CA.example.llc.key -sha256 -days 1825 -out Root.CA.example.llc.pem
echo -e "${BOLD}Generating RSA Private Key for Server Certificate${CLEAR}"
openssl genrsa -out server/example.llc.server.key 4096
echo -e "${BOLD}Generating Certificate Signing Request for Server Certificate${CLEAR}"
openssl req -new -key server/example.llc.server.key -out server/example.llc.server.csr
echo -e "${BOLD}Generating Certificate for Server Certificate${CLEAR}"
openssl x509 -req -in server/example.llc.server.csr -CA Root.CA.example.llc.pem -CAkey Root.CA.example.llc.key -CAcreateserial -out server/example.llc.server.crt -days 1825 -sha256 -extfile server/example.llc.server.ext
echo -e "${BOLD}Generating RSA Private Key for Client Certificate${CLEAR}"
openssl genrsa -out client/example.llc.client.key 4096
echo -e "${BOLD}Generating Certificate Signing Request for Client Certificate${CLEAR}"
openssl req -new -key client/example.llc.client.key -out client/example.llc.client.csr
echo -e "${BOLD}Generating Certificate for Client Certificate${CLEAR}"
openssl x509 -req -days 1825 -in client/example.llc.client.csr -CA Root.CA.example.llc.pem -CAkey Root.CA.example.llc.key -set_serial 01 -out client/example.llc.client.crt
echo "Done!"
Сервер загружает следующие учетные данные:
cntx = SSL.Context(...)
# ...
cntx.use_privatekey_file('example.llc.server.key')
cntx.use_certificate_file('example.llc.server.cert')
cntx.load_verify_locations('../Root.CA.example.llc.pem')
Клиент загружает следующие учетные данные:
cntx = SSL.Context(...)
# ...
cntx.use_privatekey_file('example.llc.client.key')
cntx.use_certificate_file('example.llc.client.cert')
cntx.load_verify_locations('../Root.CA.example.llc.pem')
Сервер запускается, как ракета
server = SSL.Connection(cntx, socket.socket(socket.AF_INET, socket.SOCK_STREAM))
server.bind(('localhost', 44000))
server.listen(1)
server.setblocking(1)
cli, addr = server.accept()
, и клиент пытается соединиться с
SSL.Connection(cntx, socket.socket(socket.AF_INET, socket.SOCK_STREAM))
sock.connect(('localhost', 44000))
, затем меня поражает это безумие:
OpenSSL.SSL.Error: [('SSL routines', 'ssl3_read_bytes', 'tlsv1 alert unknown ca')]
На данный момент я не уверен, что клиент и серверсертификаты должны быть подписаны корневым центром сертификации, если сертификат клиента должен быть подписан сертификатом сервера, или если я схожу с ума со всей этой цепочкой доверия сертификатов Мастер волшебства SSL / TLS voodoo craziness.Пожалуйста, помогите.