利用keytool/openSSL來生成伺服器和客戶端證書
J2SDK在目錄%JAVA_HOME%/bin提供了金鑰庫管理工具Keytool,用於管理金鑰、證書和證書鏈。Keytool工具的命令在JavaSE6中已經改變,不過以前的命令仍然支援。Keytool也可以用來管理對稱加密演算法中的金鑰。
最簡單的命令是生成一個自簽名的證書,並把它放到指定的keystore檔案中:
keytool -genkey -alias tomcat -keyalg RSA -keystore c:/mykey
如果c:/mykey檔案不存在,keytool會生成這個檔案。按照命令的提示,回答一系列問題,就生成了數字證書。注意,公共名稱(cn)應該是伺服器的域名。這樣keystore中就存在一個別名為tomcat的實體,它包括公鑰、私鑰和證書。這個證書是自簽名的。<o:p></o:p>
Keytool工具可以從keystore中匯出證書,但是不能匯出私鑰。對於配置apache這樣的伺服器,就不太方便。這種情況下就完全用OpenSSL吧,下面將會介紹。不過keytool對於J2EE AppServer是很有用的,它們就是用keystore儲存證書鏈的。keystore的作用類似於windows存放證書的方式,不過跨平臺了,^_^下面用Keytool生成CSR(Certificate Signing Request),並用OpenSSL生成CA簽名的證書。
1. 準備
1) 在bin目錄下新建目錄 demoCA、demoCA/certs、demoCA/certs 、 demoCA/newcerts
2) 在demoCA建立一個空檔案 index.txt
3) 在demoCA建立一個文字檔案 serial, 沒有副檔名,內容是一個合法的16進位制數字,例如 0000
4) 配置環境變數PATH,加入%JAVA_HOME%/bin,本文用的JavaSDK1.6
2. 生成CA的自簽名證書
openssl req -new -x509 -keyout ca.key -out ca.crt -config openssl.cnf
3. 生成server端證書
1) 生成KeyPair生成金鑰對
keytool -genkey -alias tomcat_server -validity 365 -keyalg RSA -keysize 1024 -keypass 123456 -storepass 123456 -keystore server_keystore
輸入common name時,要和伺服器的域名保持一致。
2) 生成證書籤名請求
keytool -certreq -alias tomcat_server -sigalg MD5withRSA -file tomcat_server.csr -keypass 123456 -storepass 123456 -keystore server_keystore
3) 用CA私鑰進行簽名,也可以到權威機構申請CA簽名。
openssl ca -in tomcat_server.csr -out tomcat_server.crt -cert ca.crt -keyfile ca.key -notext -config openssl.cnf
其中-notext表示不要把證書檔案的明文內容輸出到檔案中去,否則在後面用keytool匯入到keystore時會出錯。
4) 匯入信任的CA根證書到keystore
keytool -import -v -trustcacerts -alias my_ca_root -file ca.crt -storepass 123456 -keystore server_keystore
5) 把CA簽名後的server端證書匯入keystore
keytool -import -v -alias tomcat_server -file tomcat_server.crt -storepass 123456 -keystore server_keystore
6) 檢視server端證書
keytool -list -v -keystore server_keystore
可以看到tomcat_server的證書鏈長度是2
4. 生成client端證書
1) 生成客戶端CSR
openssl genrsa -des3 -out tomcat_client.key 1024
openssl req -new -key tomcat_client.key -out tomcat_client.csr -config openssl.cnf
2) 用CA私鑰進行簽名,也可以到權威機構申請CA簽名
openssl ca -in tomcat_client.csr -out tomcat_client.crt -cert ca.crt -keyfile ca.key -notext -config openssl.cnf
3) 生成PKCS12格式證書
openssl pkcs12 -export -inkey tomcat_client.key -in tomcat_client.crt -out tomcat_client.p12
4) 使用Keytool列出pkcs12證書的內容:
keytool -rfc -list -keystore tomcat_client.p12 -storetype pkcs12
二)openssl生成私鑰檔案(.key)和簽名請求檔案(.csr),以及簽發數字證書
操作目錄是openssl/bin(沒辦法改不了環境變數,如果你可以改的話,就不用在這個目錄下工作了),為了方便本人把apps下的openssl.cnf也複製到了這個目錄下來。檔名都是以本人使用的來說了:
1.首先要生成伺服器端的私鑰(key檔案):
openssl genrsa -des3 -out server.key 1024
執行時會提示輸入密碼,此密碼用於加密key檔案(引數des3便是指加密演算法,當然也可以選用其他你認為安全的演算法.),以後每當需讀取此檔案(通過openssl提供的命令或API)都需輸入口令.如果覺得不方便,也可以去除這個口令,但一定要採取其他的保護措施!
去除key檔案口令的命令:
openssl rsa -in server.key -out server.key
2.openssl req -new -key server.key -out server.csr -config openssl.cnf
生成Certificate Signing Request(CSR),生成的csr檔案交給CA簽名後形成服務端自己的證書.螢幕上將有提示,依照其指示一步一步輸入要求的個人資訊即可.
3.對客戶端也作同樣的命令生成key及csr檔案:
openssl genrsa -des3 -out client.key 1024
openssl req -new -key client.key -out client.csr -config openssl.cnf
4.CSR檔案必須有CA的簽名才可形成證書.可將此檔案傳送到verisign等地方由它驗證,要交一大筆錢,何不自己做CA呢.
openssl req -new -x509 -keyout ca.key -out ca.crt -config openssl.cnf
5.用生成的CA的證書為剛才生成的server.csr,client.csr檔案簽名:
Openssl ca -in server.csr -out server.crt -cert ca.crt -keyfile ca.key -config openssl.cnf
Openssl ca -in client.csr -out client.crt -cert ca.crt -keyfile ca.key -config openssl.cnf
現在我們所需的全部檔案便生成了.
另:
client使用的檔案有:ca.crt,client.crt,client.key
server使用的檔案有:ca.crt,server.crt,server.key
.crt檔案和.key可以合到一個檔案裡面,本人把2個檔案合成了一個.pem檔案(直接拷貝過去就行了)
---------------------------------------------------
合併證書檔案(crt)和私鑰檔案(key):
#cat client.crt client.key > client.pem
#cat server.crt server.key > server.pem
相關推薦
利用keytool/openSSL來生成伺服器和客戶端證書
一)keytool生成私鑰檔案(.key)和簽名請求檔案(.csr),openssl簽發數字證書 J2SDK在目錄%JAVA_HOME%/bin提供了金鑰庫管理工具Keytool,用於管理金鑰、證書和證書鏈。Keytool工具的命令在JavaSE6中已經改變,不過以前的命令仍然支援。Keytool也可以用來管
socket程式設計回射伺服器和客戶端
//回射伺服器 #include <unistd.h> #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet
網路程式設計(二)——伺服器和客戶端資訊的獲取
目錄 1、字串IP地址和二進位制IP地址結構的轉換 2.套接字檔案描述符的判定 3、IP地址與域名之間的相互轉換 4、協議名稱處理函式 1、字串IP地址和二進位制IP地址結構的轉換 #include <sys/socket.h> #inclu
第一個Netty程式——構建和執行Echo伺服器和客戶端
在構建之前,需要安裝開發環境:JDK和Apache Maven以及IDE。 pom檔案: <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-ins
Java thrift伺服器和客戶端建立例項
首先環境介紹一下: 1.IntelliJ IDEA 2017.1 2.thrift-0.9.3 相信大家在看我這篇文章的時候已經對thrift通訊框架已有所調研,這裡就不再贅述了,直接進入正題: <1>建立HelloWorld.thrift namespace jav
Spring Boot2.0 Oauth2 伺服器和客戶端配置及原理
一、應用場景 為了理解OAuth的適用場合,讓我舉一個假設的例子。 有一個"雲沖印"的網站,可以將使用者儲存在Google的照片,沖印出來。使用者為了使用該服務,必須讓"雲沖印"讀取自己儲存在Google上的照片。 問題是隻有得到使用者的授權,Google才會同意"雲沖印"讀取這些
教你如何構建非同步伺服器和客戶端的 Kotlin 框架 Ktor
Ktor 是一個使用 Kotlin 以最小的成本快速建立 Web 應用程式的框架。 Ktor 是一個用於在連線系統(connected systems)中構建非同步伺服器和客戶端的 Kotlin 框架。它由 Kotlin 團隊建立,因此,它充分利用了 Kotlin 的語言特性,為開發者提供出色的體驗和執
【Redis】Redis在Ubuntu中的伺服器和客戶端操作
伺服器端 伺服器端的命令為: redis-server 可以使用help檢視幫助文件 redis-server --help 個人習慣 ps aux | grep redis # 檢視redis伺服器程序 sudo kill -9
ROS學習筆記18 (編寫簡單的伺服器和客戶端 (C++))
1 編寫Service節點 這裡,我們將建立一個簡單的service節點("add_two_ints_server"),該節點將接收到兩個整型數字,並返回它們的和。 進入先前你在catkin workspace教程中所建立的beginner_tutorials包所在的目錄
ROS學習筆記19 (編寫簡單的伺服器和客戶端 (Python))
1 編寫服務端節點 我們會建立服務端節點 ("add_two_ints_server") ,節點接收兩個整型數字,並返回和 進入beginner_tutorials包 $ roscd beginner_tutorials 確保你確保已經在之前建立好AddTwoInts
(4)編寫簡單的伺服器和客戶端
目錄 編寫Service節點 程式碼 程式碼解釋 編寫Client節點 程式碼 程式碼解釋 編譯節點 編譯節點
Socket通訊實現伺服器和客戶端對話
廣域網和區域網 介紹socket通訊前我們先介紹一下廣域網與區域網的概念。區域網簡稱LAN,是指在某一區域幾臺計算機組成的計算機組,區域網是封閉的,區域網經常採用共享通道,即共用同一條電纜。廣域網簡稱WAN,是一種跨越大的,地域性的地區性網路集合廣域網包含大大小
網路程式設計 伺服器和客戶端之間流的傳遞
import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.net.Socket; /* 實現TCP客戶端,連線到伺服器 和伺服器
C#實現伺服器和客戶端之間通訊
TCP 套接字程式設計 伺服器端實現步驟: 1、使用Socket類建立套接字。 2、利用Bind方法將建立的套接字繫結到指定的地址結構。 3、利用Listen方法設定套接字為監聽模式,使得伺服器進入被動開啟狀態。 4、接受客戶端的連線請求。 5、接收、應答客戶端的資料請求
python實現tcp伺服器和客戶端(socket)
python實現tcp伺服器和客戶端(socket) 1.socket模組 socket是什麼 socket最初是為了同一主機上的應用程式建立的,使得一個程式與另外一個程式之間可以通訊,也就是所謂的程序間通訊,有兩種型別的socket:基於檔案和麵向網路的。
用node.js模擬伺服器和客戶端
伺服器 程式碼 var net = require("net") var server = net.createServer(); server.listen(12306,"127.0.0.1") server.on("listening",function(){ consol
libevent簡單介紹以及使用(帶有伺服器和客戶端)
這兩天使用了下libevent,只使用了網路IO事件(EV_READ和 EV_WRITE),查閱了下libevent的介面文件,這裡做點筆記,並附上程式碼,開發環境是win7+vs2010 這裡只介紹需要用到的libevent的介面函式,更多介面函式請檢視libevent官方文件 如果想了解
java實現伺服器和客戶端之間的檔案傳輸
實現思路 一、客戶端發文件:首先建立和伺服器的連線,然後我們通過IO流來實現資料的傳輸,步驟: 1、通過伺服器的IP地址和埠號實現和伺服器的連線(這裡不要忘記先開伺服器哦) 2、獲取本地的檔案的地址,建立java和檔案的連線。 3、獲取檔案輸入流和資料輸出流(注意:這裡的輸入和輸出都是指
在Android上實現SSL握手,實現伺服器和客戶端之間Socket互動
public class MySSLSocket extends Activity { private static final int SERVER_PORT = 50030;//埠號 private static final String SERVER_IP = "218.206.17
簡單的TCP 流式socket 伺服器和客戶端程式碼示例
電子書在這裡,見6.8.1 和6.8.2 章節,書中的程式碼有很多錯誤,包括#include、socket 描述符賦值等,正確的程式碼在這裡 Server 程式碼: #include <stdio.h> #include <stdlib.h> #in