web-dev-qa-db-ja.com

stunnel-証明書の検証

RedisにSSLを提供するためのstunnelがあります。私は次の構成を持っています:

[redis]
CAfile= /etc/stunnel/ca.crt
accept = 636
cert = /etc/stunnel/server1.crt
connect = localhost:6379
key = /etc/stunnel/server1.key
verify = 2

Opensslを使用してすべてのキーと証明書を生成します。

# generate ca    
openssl req -new -x509 \
            -keyout "/etc/stunnel/ca.crt" \
            -out "/etc/stunnel/ca.key" \
            -days 365 \
            -passout "pass:123456" \
            -subj "$subj"

次に、openssl genrsa -des3を介してキーを生成しています。次に、openssl req -new -keyを介してcsrを生成しています。次に、CACAkeyopenssl x509 -reqca.crtを指すca.keyを介して署名付き証明書を生成します。次にopenssl rsaを介してキーを復号化します。

上記の手順は、サーバーとクライアントのキーペアを生成するために2回実行されます。サーバーはstunnelconfigに移動し、クライアントはpython application:

r = redis.Redis(Host='localhost', ssl=True, port=636, db=0, ssl_certfile='client.crt', ssl_keyfile='client.key')

pythonスクリプトを実行しようとすると、次のようになります。

redis.exceptions.ConnectionError: Error 1 connecting to localhost:636. [SSL: TLSV1_ALERT_UNKNOWN_CA] tlsv1 alert unknown ca (_ssl.c:590).

Stunnelログで:

2017.09.16 09:11:00 LOG6[9]: Peer certificate required
2017.09.16 09:11:00 LOG7[9]: SSL state (accept): before/accept initialization
2017.09.16 09:11:00 LOG7[9]: SNI: no virtual services defined
2017.09.16 09:11:00 LOG7[9]: SSL state (accept): SSLv3 read client hello A
2017.09.16 09:11:00 LOG7[9]: SSL state (accept): SSLv3 write server hello A
2017.09.16 09:11:00 LOG7[9]: SSL state (accept): SSLv3 write certificate A
2017.09.16 09:11:00 LOG7[9]: SSL state (accept): SSLv3 write key exchange A
2017.09.16 09:11:00 LOG7[9]: SSL state (accept): SSLv3 write certificate request A
2017.09.16 09:11:00 LOG7[9]: SSL state (accept): SSLv3 write server done A
2017.09.16 09:11:00 LOG7[9]: SSL state (accept): SSLv3 flush data
2017.09.16 09:11:00 LOG7[9]: Verification started at depth=0: C=US, O="MyO", OU=MyOU, CN=redis
2017.09.16 09:11:00 LOG4[9]: CERT: Pre-verification error: self signed certificate
2017.09.16 09:11:00 LOG4[9]: Rejected by CERT at depth=0: C=US, O="MyO", OU=MyOU, CN=redis
2017.09.16 09:11:00 LOG7[9]: SSL alert (write): fatal: unknown CA
2017.09.16 09:11:00 LOG3[9]: SSL_accept: 140360B2: error:140360B2:SSL routines:ACCEPT_SR_CERT:no certificate returned
2017.09.16 09:11:00 LOG5[9]: Connection reset: 0 byte(s) sent to SSL, 0 byte(s) sent to socket

この振る舞いは私にはわかりません:

  • stunnelconfigでverify = 2は、クライアントのCAを信頼できるCAと比較する必要があります
  • stunnelのCAfileはCAに設定されており、サーバーキーとクライアントキーの両方に署名されています
  • stunnelは、自己署名証明書であり、CAは不明であると述べています

また、openssl verify -CAfile=ca.crt <filename>は、サーバーとクライアントの両方で問題ありません。

1
Rahul
redis.exceptions.ConnectionError: Error 1 connecting to localhost:636. [SSL: TLSV1_ALERT_UNKNOWN_CA] tlsv1 alert unknown ca (_ssl.c:590).

クライアントはCAの証明書を検証できません。したがって、システムの証明書ストアに保存するか、クライアントがそれを受け入れるように構成します。

サーバーでも同じことを行います。

1
sebix