2010-11-24 10 views
2

私には奇妙な要求があります。私はC#で書かれたサーバと通信しようとしています。PythonまたはRubyまたはPerlを使用した.NET Sslstream x.509ソケットへの接続

SslStream sslStream = new SslStream(client.GetStream(), true, 
            ValidateServerCertificate, 
            SelectLocalCertificate); 
sslStream.AuthenticateAsServer(_pushCert); 

私もX509証明書を使用してサーバに接続するのC#のコード例を持っている:それは基本的にこのようになります。私はcert.pfxファイルのパスワードも持っています。

私がしたいのは、ソケットに接続して数バイトを送信して応答を受け取ることのできる何らかのシェルスクリプトをセットアップすることです。

私はPythonからSSLラッパーを使ってみましたが、サーバー/クライアントが話すアルゴリズムが知られていないというエラーが表示されます。私のPythonコードの

例:CERTのために

ss = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
s = ssl.wrap_socket(ss, ca_certs=CERT, ssl_version=ssl.PROTOCOL_SSLv23) 
#Attempt connection to our server 
try: 
    s.connect((HOST, PORT)) 
    print s 
except: 
    print 'ERROR Connecting' 
    sys.exit(0) 

私はいくつかの異なるfilee試してみました:.PFXを、そしていくつかは、OpenSSLを使用して.PFXから抽出されました。

多くの異なる例も試しました(ssl.wrap_socketの引数)。私はこれらの接続にも慣れていません。

おそらく誰かが手を貸すことができますか?

ありがとうございます!

+0

サーバーは、クライアントではなくサーバーの秘密キーにアクセスする必要があります。 –

+0

私が使用したCert(.pfx)は、このサーバーに接続するC#クライアントからのものでした。「例外的な」エラーは、「クライアントとサーバーが共通のアルゴリズムを持っていないため通信できません」 – Chris

+0

AuthenticateAsServerがデフォルトでSSL 3.0またはTLS 1.0を使用していて、PythonコードがSSL 2または3を使用しているようです。だから、彼らは* SSL 3.0(すべての実装がサポートしなければならない一連のアルゴリズムを指定しています)に同意すべきです。私はここで失敗の唯一の可能な点は証明書であると言います。別のものを試してみてください。 ([makecert.exe](http://msdn.microsoft.com/en-us/library/bfsktky3 \(v = VS.100 \).aspx)を使用して、自己署名証明書を簡単に作成できます。 – dtb

答えて

0

あなたのSslStreamのコンストラクタの呼び出しを簡素化することができます。

SslStream sslStream = new SslStream(client.GetStream()); 
sslStream.AuthenticateAsServer(_pushCert); 

このサーバは_pushCertを送信し、クライアントが証明書を送り返すことを期待していません。サーバーはSSL接続を確立するために証明書の秘密鍵を必要とします。

クライアントは、サーバー証明書に署名したCAルート証明書(または信頼できない証明書を受け入れるオプション)のみが必要です。これは、「信頼できるルート証明書ストア」にあるか、またはクライアントラッパー。

サーバー証明書がルートCA証明書で署名された中間CA証明書で署名されている場合、クライアントにはその中間証明書も必要です。これは、サーバーによって送信されるか、既にクライアントに存在する可能性があります。いずれにしても、チェーンに沿ったすべての署名を検証するには、署名証明書のチェーン全体がクライアント側になければなりません。中間CA証明書は、信頼できるルートストアに存在する必要はありません。

どちらの側も、CAルートの秘密鍵または中間署名証明書を必要としません。

しかし、サーバーがクライアントにクライアント証明書を送信することを期待する場合は、より多くの引数(clientCertificateRequired == true)でAuthenticateAsServerを呼び出す必要があります。その場合、クライアントは独自の証明書とその証明書の秘密鍵の両方を必要とします。サーバーには、信頼できるストア内のクライアント証明書に署名するCAルートが必要です。クライアントラッパーは、たとえば、クライアント証明書と秘密鍵を含むpfxファイルを使用します。サーバーはクライアントの秘密鍵を必要としません。

関連する問題