1. 程式人生 > >利用keytool/openSSL來生成伺服器和客戶端證書

利用keytool/openSSL來生成伺服器和客戶端證書

一)keytool生成私鑰檔案(.key)和簽名請求檔案(.csr),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