2012-09-25 51 views
6

我正在學習SSL,在此過程中,我嘗試在.NET客戶端與.NET服務器之間創建SSL連接。我爲此使用自簽名證書。我不想在Java中使用標準密鑰庫,所以我創建了一個自定義密鑰庫並加載它。從Java客戶端到.NET服務器進行SSL連接時出錯

我使用以下步驟來生成證書和在.NET服務器端使用的pfx文件。

  1. 在windows上使用以下命令生成一個cerficiate。

    makecert -r -pe -SR 「localhost」 的 - $個人-n 「CN = localhost」 的-sv .pvk -r localhost.cer

  2. 轉換這到.pfx如此我可以在.NET服務器應用程序中加載此證書。

  3. 將.cer文件導出爲.pem(Base64格式)。

  4. 使用以下命令獲取.cer文件(上述證書的公共組件)並創建一個.jks文件(JavaKeyStore)以用作java客戶端。

    密鑰工具\ -import \ -v \ -trustcacerts \ -alias 0 \ -file <(OpenSSL的X​​509 -in localhost.pem)\ -keystore mystore.jks \ -storetype JKS \ -storepass ez24get

  5. 加載此.jks在Java客戶端應用程序,並開始用下面的代碼連接

    FileInputStream fis = new FileInputStream("res/myjksstore.jks"); 
    KeyStore trusted = KeyStore.getInstance("JKS"); 
    trusted.load(fis, "ez24get".toCharArray());   
    
    TrustManagerFactory trustManagerFactory = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm()); 
    trustManagerFactory.init(trusted); 
    
    SSLContext context = SSLContext.getInstance("SSL"); 
    context.init(null, trustManagerFactory.getTrustManagers(), new SecureRandom()); 
    
    Socket socket = context.getSocketFactory().createSocket("localhost", 443); 
    
    String str = "abc123"; 
    
    socket.getOutputStream().write(GeneralUtil.toByta(str.length())); 
    socket.getOutputStream().write(str.getBytes()); 
    
    socket.setKeepAlive(true); 
    

但是,當我嘗試將數據寫入套接字,我得到在服務器端下面的錯誤

System.ComponentModel.Win32Exception:客戶端和服務器不能通信,因爲它們不具有通用算法

我的服務器代碼如下所示...

X509Certificate cert = new X509Certificate(「localhost.pfx」,「abc123」);

TcpListener listener = new TcpListener(IPAddress.Loopback,443); listener.Start();

而(真){

嘗試{的TcpClient的TcpClient =監聽器。AcceptTcpClient();

NetworkStream networkStream = tcpClient.GetStream(); 

    SslStream sslStream = new SslStream(networkStream); 

    sslStream.AuthenticateAsServer(cert, false, SslProtocols.Default, 

false);

byte[] data1 = new byte[4]; 

    sslStream.Read(data1, 0, data1.Length); 

    int len = BitConverter.ToInt32(data1, 0); 

    String message = "Length of incoming data " + 

BitConverter.ToInt32(data1,0);

byte[] data2 = new byte[len]; 

    sslStream.Read(data2, 0, data2.Length); 

    message += " Message: " + ASCIIEncoding.ASCII.GetString(data2); 

    Thread.Sleep(1000);  

}趕上(異常前)
{
} }

發生在線路

sslStream.AuthenticateAsServer(CERT,假,SslProtocols.Default的異常,假);

這可能是什麼原因,我該如何解決它?

任何幫助將高度讚賞。 (從獲得的SSLContext)

+3

嘗試使用OpenSSL的連接到服務器並檢查avaliable密碼套件。 'openssl s_client -connect localhost:443 -CAfile '後請輸出此命令。 – user1516873

+0

您是否已成功使用此代碼的某種變體使用標準密鑰存儲庫進行連接,或者這是您在SSL連接上的第一個鏡頭? – TheBlastOne

+0

沒有..我沒有進一步追求這一點,因爲由於性能相關的原因,我不得不放棄SSL Streams。我剛剛實現了RSA握手以共享會話密鑰,然後使用AES加密來處理傳輸。與SSL相似。 –

回答

-1

的SSLEngine必須設置爲客戶端模式(setUseClientMode)

+0

這是默認設置,他根本不使用SSLEngine。 -1 – EJP

相關問題