2017-05-31 6 views
0

私は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を使用しています。

+0

が。ホスト名は常に* SAN *に入ります。 * CN *内に存在する場合は、* SAN *にも存在する必要があります(この場合は2回リストする必要があります)。詳細なルールと理由については、[証明機関との証明書署名要求の署名方法](http://stackoverflow.com/a/21340898/608639)および[opensslによる自己署名証明書の作成方法]( http://stackoverflow.com/q/10175812/608639)また、自己署名証明書を適切なトラストストアに配置する必要があります。 – jww

+0

サーバへの接続に使用している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

答えて

0

SSL_newを試すには、コンテキストを完全に設定してから、プログラムの最初にOpenSSL_add_ssl_algorithmsがあることを確認してください。 1.0.2のドキュメントでは、 "継承"していますが、その時点で設定をコピーし、それ以降の変更は適用されないことを意味するかどうかは不明です。

https://www.openssl.org/docs/man1.0.2/ssl/SSL_new.html

新しい構造は、基礎となるコンテキストctxの設定を継承:接続方法(のSSLv2/V3/TLSv1の)、オプション、検証の設定、タイムアウト設定。

エラー処理なしの線に沿って行くOpenSSL wiki

上の例でもあります: `CNはmyhostname` ***は、おそらく間違っている= ***

// General initialisation 
SSL_load_error_strings(); 
OpenSSL_add_ssl_algorithms(); 
// Context for a server socket 
ctx = SSL_CTX_new(SSLv23_server_method()); //Note SSLv23_server_method in example is deprecated in favour of TLS_server_method for new versions. TLSv1_2_server_method will force TLS 1.2. 
SSL_CTX_set_ecdh_auto(ctx, 1); 
SSL_CTX_use_certificate_file(ctx, "cert.pem", SSL_FILETYPE_PEM); 
SSL_CTX_use_PrivateKey_file(ctx, "key.pem", SSL_FILETYPE_PEM); 
// Only after all certificates, and other config is set 
ssl = SSL_new(ctx); 
SSL_set_fd(ssl, client_socket); 
SSL_accept(ssl); 
// Use SSL_write and SSL_read 
SSL_free(ssl); 
close(client_socket); 
// OpenSSL cleanup 
EVP_cleanup(); 
+0

まだ同じエラーが発生しています。証明書を特定の場所にコピーする必要がありますか? – robert

+0

サンプルコードを試してみませんか? 'SSL_CTX_use_certificate_file'などは、有効なファイルが与えられていないとエラーになります(通常のファイルパスなので、 '/ absolute'またはそうでなければ現在のディレクトリです)。したがって、サーバーコードでエラーが発生していない場合は、例とは異なる何かをしたように見えます。サンプルコードと同じシステム上の 'openssl s_client'は、あなたが示した自己署名コマンドラインを使って" Return code:18(自己署名証明書) "を返します。 –

+0

投稿したコードの外で、OpenSSLの設定手順のいくつかをスキップしましたか?例えば ​​'OpenSSL_add_ssl_algorithms'ですか? –

関連する問題