2015-06-16 90 views
1

我對服務器和客戶端使用boost ssl,我有一個服務器/客戶端程序模型,我不確定它會工作。創建由我自己簽名的OpenSSL證書

我腦海中的模型是我的程序證書的唯一權威。我的主要問題是:我該怎麼做?

在我的服務器程序,我定義項,如下所示:

context_.use_certificate_chain_file("../sslkeys/server.crt"); 
    context_.use_private_key_file("../sslkeys/server.key", boost::asio::ssl::context::pem); 
    context_.use_tmp_dh_file("../sslkeys/dh512.pem"); 

創建/登錄這些鍵/使用證書:

$ openssl genrsa -des3 -out server.key 2048 
$ openssl req -new -key server.key -out server.csr 
$ openssl x509 -req -days 3650 -in server.csr -signkey server.key -out server.crt 
$ cp server.key server.key.secure 
$ openssl rsa -in server.key.secure -out server.key 
$ openssl dhparam -out dh512.pem 512 

對於我的客戶端程序,我想創造一個證書,並通過我的「server.key」簽名,因爲我認爲(如果我是的話,我可能是錯的,請糾正我)這是做這件事的方法。客戶端程序需要使用命令鍵:

ctx.load_verify_file("../sslkeys/client.csr"); 

所以我創建了一個關鍵的,這是我使用服務器密鑰簽名,用下面的命令:

$ openssl genrsa -des3 -out client.key 2048 
$ openssl req -new -key client.key -out client.csr 
$ openssl x509 -req -days 3650 -in client.csr -signkey ../sslkeys/server.key -out client.crt 

現在,當我跑我的客戶和嘗試連接服務器,我得到的錯誤:Handshake failed: certificate verify failed

我在做什麼錯?我怎樣才能實現我提到的模型?

如果您需要任何其他信息,請詢問。

謝謝你的努力。

+0

Stack Overflow是編程和開發問題的網站。這個問題似乎與題目無關,因爲它不涉及編程或開發。請參閱幫助中心的[我可以詢問哪些主題](http://stackoverflow.com/help/on-topic)。也許[超級用戶](http://superuser.com/)或[Unix&Linux堆棧交換](http://unix.stackexchange.com/)會是一個更好的地方。另請參閱[我在哪裏發佈有關Dev Ops的問題?](http://meta.stackexchange.com/q/134306)。 – jww

回答

2

您的簽名證書無權簽名,因爲它沒有設置CA標誌。簽名仍然有效,但驗證將失敗。由於互聯網上已有大量指南,詳細說明如何正確使用,因此您可能只需查看herehere瞭解更多詳情。

此外,僅使用512位Diffie-Hellmann將密鑰交換的安全性降低到512位,這在今天可以利用(另請參閱Logjam攻擊)。 2048 RSA密鑰在這裏沒有幫助。如果您使用最新版本的OpenSSL,出於安全原因而將最小尺寸增加到768位,並且使用512位可能無法工作。

+0

非常感謝。我會試試這個,並且給你一個檢查,如果這個工程。但是,請問,如果我把dh鍵增加到2048,是否能解決問題?或者還有其他考慮因素需要考慮? –

+0

只要客戶端支持DH密鑰,就可以將DH密鑰增加到2048。使用Java,您至少需要JDK8,並且Internet Explorer可能存在問題。另見http://blog.ivanristic.com/2013/08/increasing-dhe-strength-on-apache.html。 –

+0

我現在有CA密鑰(ca.key和ca.crt)和由我的CA簽名的服務器/客戶端密鑰。但是在這種情況下,我必須提供給我的服務器程序的證書鏈文件是什麼?沒有一個環節解釋這個概念。我嘗試了我的密鑰的可能組合,他們不工作。你能告訴我我的證書鏈應該是什麼嗎?謝謝。 –