3

クラス用の単純なサーバーを作成していて、「クリエイティブ」コンポーネントがあるため、それに SSL を追加したいと考えています。接続を SSLSocket でラップしようとしていますが、2 つの異なるエラーが発生しますが、それらを理解できません。ソケットをラップしようとすると、Safariで最初に発生し、次のようになります。

Traceback (most recent call last):
  File "./junk.py", line 12, in <module>
    connstream = ssl.wrap_socket(connected_socket,certfile="cert.pem",keyfile="cert.pem",server_side=True,cert_reqs=ssl.CERT_NONE,ssl_version=ssl.PROTOCOL_TLSv1,suppress_ragged_eofs=True)
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/ssl.py", line 372, in wrap_socket
    ciphers=ciphers)
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/ssl.py", line 134, in __init__
    self.do_handshake()
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/ssl.py", line 296, in do_handshake
    self._sslobj.do_handshake()
ssl.SSLError: [Errno 8] _ssl.c:503: EOF occurred in violation of protocol

Safari が証明書が有効ではないことをユーザーに伝えた場合 (コマンドを使用して自己署名証明書を作成しました: openssl req -new -x509 -days 365 -nodes -out cert.pem -keyout cert.pem)、証明書が問題ないことを伝えると、次回は通過します。

ただし、Firefox では、クライアント (Firefox) がサーバーに送信したものを読み取ろうとすると、まったく別のエラーが発生します。

Traceback (most recent call last):
  File "./junk.py", line 13, in <module>
    recieved = connstream.read() 
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/ssl.py", line 151, in read
    return self._sslobj.read(len)
ssl.SSLError: [Errno 1] _ssl.c:1354: error:14094418:SSL routines:SSL3_READ_BYTES:tlsv1 alert unknown ca

以下は私が使用したコードです:

  1 #!/usr/bin/python
  2 import socket
  3 import ssl
  4 
  5 serverPort = 22222
  6 serverSocket = socket.socket( socket.AF_INET, socket.SOCK_STREAM )
  7 serverSocket.bind( ( '127.0.0.1', serverPort ) )
  8 serverSocket.listen( 10 )
  9 
 10 while True:
 11     connected_socket, from_addr = serverSocket.accept()
 12     connstream = ssl.wrap_socket(connected_socket,certfile="cert.pem",keyfile="cert.pem",server_side=True,cert_reqs=ssl.CERT_NONE,ssl_version=ssl.PROTOCOL_TLSv1,suppress_ragged_eofs=True)
 13     recieved = connstream.read()
 14     print recieved
 15     connstream.unwrap()
 16     connected_socket.close()

誰でも私が理解するのを手伝ってくれますか:

1) これらのエラーの意味

2) 取得する理由

3)これらを修正するにはどうすればよいですか

(思いつく限りの方法で検索しました)

ありがとう、

アンドリュー

4

1 に答える 1

2

申し訳ありませんが、まだコメントできません。これは回答を意図したものではありません。

なぜ常に車輪を再発明するのですか?つまり、Python ベースのものが必要な場合は、Tornado を使用してみませんか? ところで、彼らがこの問題をどのように解決しているかを見ることができます: http://www.tornadoweb.org/documentation/httpserver.html

人々は常に「教育目的」のため、または既存の解決策が「肥大化」している、「重い」などの理由で車輪を再発明しているようです (つまり、「ここでは発明されていません」)。同じことが何度も何度も行われるのは残念なことですが、通常は間違った方法で行われます。

Safariはハンドシェイクを尊重しません。これは、証明書が自己署名されているためです。Firefox は、証明書が自己署名であるため、証明書を受け入れません。これらのエラーは正常です。ユーザーはブラウザで「信頼できる」接続を受け入れる必要があります。その間、サーバーは応答を受信しないか、拒否されます。

Tornado を見て、彼らがそれをどのように処理しているかを確認してください。しかし、真新しい、半分壊れた http サーバーを作成するよりも、それを研究し、使用し、貢献したほうがよいと私は本当に思います。

于 2013-02-06T10:09:30.333 に答える