私はSSL接続を受け付けるサーバーを作成しています。私は、自己署名証明書を生成した:自己署名証明書で利用できるピア証明書がありません
openssl req -new -x509 -days 365 -nodes -out self.pem -keyout self.pem -subj "/CN=myhostname"
はSSL_accept
は、このメッセージで失敗します。ここでは
140121764049248:error:1408A0C1:SSL routines:ssl3_get_client_hello:no shared cipher:s3_srvr.c:1417:
は、サーバコードの一部です:
sslCtx = (SSL_CTX_new(SSLv23_server_method());
if (!sslCtx){
ERR_print_errors_fp(stderr);
throw runtime_error("SSL_CTX_new failed");
}
ssl = SSL_new(sslCtx);
if (!ssl)
throw runtime_error("SSL_new failed");
if (SSL_CTX_use_PrivateKey_file(sslCtx, keyFile.c_str(),
SSL_FILETYPE_PEM) != 1)
throw runtime_error("Unable to load private key file" + keyFile);
if (SSL_CTX_use_certificate_file(sslCtx, certFile.c_str(),
SSL_FILETYPE_PEM) != 1)
throw runtime_error("Unable to load certificate file" + certFile);
if (SSL_set_fd(ssl, socket) != 1)
throw runtime_error("SSL_set_fd failed");
if (SSL_accept(ssl) != 1){
ERR_print_errors_fp(stderr);
throw runtime_error("SSL_accept failed");
}
私は、サーバーをテストしてみました:
openssl s_client -cipher RSA -connect myhostname:33221 -tls1 -CApath . -servername myhostname
となっております。
CONNECTED(00000003)
139898773520408:error:14094410:SSL routines:ssl3_read_bytes:sslv3 alert handshake failure:s3_pkt.c:1487:SSL alert number 40
139898773520408:error:1409E0E5:SSL routines:ssl3_write_bytes:ssl handshake failure:s3_pkt.c:656:
---
no peer certificate available
---
No client certificate CA names sent
---
SSL handshake has read 7 bytes and written 0 bytes
---
New, (NONE), Cipher is (NONE)
Secure Renegotiation IS NOT supported
Compression: NONE
Expansion: NONE
No ALPN negotiated
SSL-Session:
Protocol : TLSv1
Cipher : 0000
Session-ID:
Session-ID-ctx:
Master-Key:
Key-Arg : None
PSK identity: None
PSK identity hint: None
SRP username: None
Start Time: 1496232544
Timeout : 7200 (sec)
Verify return code: 0 (ok)
---
私はOpenSSL 1.0.2gを使用しています。
が。ホスト名は常に* SAN *に入ります。 * CN *内に存在する場合は、* SAN *にも存在する必要があります(この場合は2回リストする必要があります)。詳細なルールと理由については、[証明機関との証明書署名要求の署名方法](http://stackoverflow.com/a/21340898/608639)および[opensslによる自己署名証明書の作成方法]( http://stackoverflow.com/q/10175812/608639)また、自己署名証明書を適切なトラストストアに配置する必要があります。 – jww
サーバへの接続に使用しているURLを指定し、 'openssl s_client -connectの出力を投稿してください: -tls1 -servername | openssl x509 -text -noout'です。 OpenSSL wikiの[TLS Client](https://wiki.openssl.org/index.php/SSL/TLS_Client)も参照してください。クライアントのコンテキストで 'SSL_CTX'をうまく設定する方法を示します。そのほとんどはサーバーにも適用されます。また、これは問題を引き起こすかもしれません: 'if(SSL_accept(ssl)!= 1)'、特にノンブロッキングソケットで。私は非ブロッキングソケットがしばしば '-1'とエラーではないことを思い出しているようです。 –
jww