X509證書
㈠ https協議怎麼通過X509TrustManager介面實現自己創建的證書
SSL 連接的 context 目前用那個 KeyManager, TrustManager 的實現(Sun 公司提供的)都是默認地從命令行提供的參數或版代碼中明確初始權化的 trust manager / key manager 中查找的,這裡面可以肯定的是這個參數在連接建立之前已經固定了的靜態形式,這要求我們把可以信任的伺服器證書的頒發機構的根證書先導入到 trust store 中然後指派給 java 程序。
因此當我們的伺服器使用了一張不在 trust store 中的信任根證書機構名錄中的證書是不會被信任的,因此我們必須提供一個有別於 Sun 的 Trust Manager 介面的實現類,然後像 IE 瀏覽器那樣在查找證書來確認是否信任時彈出一個對話框出來讓用戶檢查,當用戶點擊「以後一直信任該證書的廠商」時我們把它緩存在持久性介質(比如文件或資料庫)中,下次訪問時先看是否有緩存的,沒有再來彈對話框讓用戶確認,當伺服器要求客戶端出示客戶端證書時(比如網銀業務)我們同樣需要提供自己的 key manager 實現。
㈡ 如何從X509證書獲得的KeyUsage值
創建X509 證書
創建X509證書方法較多,在Windows 環境下大致總結了幾中辦法,
1) 通過CA獲取證書,
2) 通過微軟提供的makecert 工具回得到測試證書
3) 編程的方法創建,.Net提供了 X509Certificate2 類,該類可以用於創建證答書,但只能從RawData中創建,創建後無法修改除FriendlyName以外的任何屬性。
我在互聯網上找了很久,始終沒有找到完全通過程序創建自定義的證書的方法。後來想了一個折中辦法,就是用程序調用 makecert.exe 先生成一個證書,證書的一些參數如Subject,有效期,序列號等可以通過參數傳入,然後把生成的證書文件讀到Rawdata中,得到X509Certificate2 類型的證書對象。當然這種方法確實比較笨,必須要依賴外部進程。等後面有時間的話,我還是想按照X509 V3 標准,自己創建RawData,然後生成證書,這樣應該是比較靈活的做法。不知道網友們有沒有什麼更好的方法來創建一個自定義的證書。
㈢ 求教一個X509Certificate2的問題
創建X509證書方法較多,在Windows 環境下大致總結了幾中辦法,
1) 通過CA獲取證書,
2) 通過微軟提供的makecert 工具得到測試證書
3) 編程的方法創建,.Net提供了 X509Certificate2 類,該類可以用於創建證書,但只能從RawData中創建,創建後無法修改除FriendlyName以外的任何屬性。
我在互聯網上找了很久,始終沒有找到完全通過程序創建自定義的證書的方法。後來想了一個折中辦法,就是用程序調用 makecert.exe 先生成一個證書,證書的一些參數如Subject,有效期,等可以通過參數傳入,然後把生成的證書文件讀到Rawdata中,得到X509Certificate2 類型的證書對象。當然這種方法確實比較笨,必須要依賴外部進程。等後面有時間的話,我還是想按照X509 V3 標准,自己創建RawData,然後生成證書,這樣應該是比較靈活的做法。不知道網友們有沒有什麼更好的方法來創建一個自定義的證書。
通過 makecert.exe 創建X509證書的代碼如下,供大家參考
static object semObj = new object();
/// <summary>
/// 自定義的證書信息
/// </summary>
public class T_CertInfo
{
public String FriendlyName;
public String Subject;
public DateTime BeginDate;
public DateTime EndDate;
public int SerialNumber;
}
/// <summary>
/// 生成X509證書
/// </summary>
/// <param name="makecrtPath">makecert進程的目錄</param>
/// <param name="crtPath">證書文件臨時目錄</param>
/// <param name="certInfo">證書信息</param>
/// <returns></returns>
public static X509Certificate2 CreateCertificate(String makecrtPath, String crtPath,
T_CertInfo certInfo)
{
Debug.Assert(certInfo != null);
Debug.Assert(certInfo.Subject != null);
string MakeCert = makecrtPath + "makecert.exe";
string fileName = crtPath + "cer";
string userName = Guid.NewGuid().ToString();
StringBuilder arguments = new StringBuilder();
arguments.AppendFormat("-r -n \"{0}\" -ss my -sr currentuser -sky exchange ",
certInfo.Subject);
if (certInfo.SerialNumber > 0)
{
arguments.AppendFormat("-# {0} ", certInfo.SerialNumber);
}
arguments.AppendFormat("-b {0} ", certInfo.BeginDate.ToString(@"MM\/dd\/yyyy"));
arguments.AppendFormat("-e {0} ", certInfo.EndDate.ToString(@"MM\/dd\/yyyy"));
arguments.AppendFormat("\"{0}\"", fileName);
㈣ openssl,x509,crt,cer,key,csr,ssl,tls 這些都是什麼鬼
OpenSSL:是一個安全套接字層密碼庫。
X.509:是一種非常通用的證書格式。
crt (證書文件):客戶端認版證的證書。
CER 編輯權 CER有兩層意思:用於存儲公鑰證書的文件格式。
key:SSL證書鑰匙(證書密鑰)
csr:證書SSL證書前提文件(審批請求文件,裡麵包括域名、聯系人信息 )
ssl:是為網路通信提供安全及數據完整性的一種安全協議(常見SSL證書用於HTTPS)
TLS:安全傳輸層協議(TLS)用於在兩個通信應用程序之間提供保密性和數據完整性。
總結:以上是用於SSL證書加密的專業格式文件。
㈤ x509 證書解析
http://blog.csdn.net/tsh185/article/details/8600079
這個參考下,不知是否對你回有幫答助
㈥ 如何將證書字元串轉換為X509結構
(1)Openssl生成公私鑰
使用Openssl是為了生成公鑰和私鑰對,用於外部商戶系統和xxx系統之間報文的安全性驗證。如果使用者不需要生成公私鑰,而是直接對報文進行處理,則參考第四部分,計算摘要及簽名值。
1. 安裝openssl步驟直接點擊exe文件。出現需要安裝vs2008插件的,直接忽略。
2. 在安裝過程中找到OpenSSL相應的安裝目錄,進入bin目錄下找到openssl.exe可執行文件,點擊運行。然後分別按順序輸入如下命令:
a. genrsa –out private-rsa.key 1024
說明:該命令是生成一個沒有加密的私鑰
genrsa 生成私鑰文件,私鑰存儲在private-rsa.key中,長度為1024。out後面指定輸出文件名。
private-rsa.key 為生成的私鑰文件,但該文件必須經過處理得到私鑰。
b. req –new –x509 –key private-rsa.key –days 750 –outpublic-rsa.cer
說明:根據private-rsa.key生成證書public-rsa.cer
-new 表示新的請求
-509 表示輸出的證書結構
750表示證書有效天數
-out public-rsa.cer -out後面表示公鑰證書,用於驗證數字簽名,此公鑰證書或者公鑰需要提前發送給需要驗證本單位或部門數據的接收方。
c. pkcs12 –export –name test-alias –in public-rsa.cer–inkey private-rsa.key –out 99bill-rsa.pfx
說明:生成PKCS12 格式Keystore
密碼前後輸入要一致,這個密碼在用Keystore生成公私鑰過程中會用到。
Public-rsa.cer, private-rsa.key是之前生成的。
附1:
下述代碼是從99bill-rsa.pfx中獲取私鑰的Java版本代碼。因為private-rsa.key中生成的私鑰無法直接使用,必須進行一定的處理。
代碼有幾個注意點:
文件流初始化路徑需要根據自己的實際路徑來填寫。
密碼是在第二節中c步驟中的密碼,本實例輸入的是suning。
KeyStorekeyStore = KeyStore.getInstance("PKCS12");
= newFileInputStream("D:/OpenSSL/bin/99bill-rsa.pfx");
char[]nPassword = "suning".toCharArray();
StringkeyAlias = null;
keyStore.load(fileInputStream,nPassword);
fileInputStream.close();
System.out.println("keystoretype=" + keyStore.getType());
Enumerationenumeration = keyStore.aliases();
if(enumeration.hasMoreElements())
{
keyAlias = (String) enumeration.nextElement();
System.out.println("alias=[" + keyAlias +"]");
}
System.out.println("iskey entry=" + keyStore.isKeyEntry(keyAlias));
PrivateKeyprikey = (PrivateKey) keyStore.getKey(keyAlias, nPassword);
//私鑰轉成字元串
StringprivateStr = Base64.encodeBase64String(prikey.getEncoded()).trim();
//生成公鑰字元串,還可以通過cer證書生成
Certificatecert = keyStore.getCertificate(keyAlias);
PublicKeypubkey = cert.getPublicKey();
StringpublicStr = Base64.encodeBase64String(pubKey.getEncoded()).trim();
注意:
1. 所用類的說明:
Base64:
import org.apache.commons.net.util.Base64;
Certificate:
import java.security.cert.Certificate;
2. 在openssl生成公私鑰過程中,用戶輸入了密碼。本例中密碼為suning。
1. 摘要及生成方法
摘要的生成過程(digest方法全部實現了下述3個過程):
1. 根據key對傳來的map數據排序;
2. 生成a1=b1&a2=b2&a3=b3形式的字元串,排除某些字元串Key值;
3. 調用digest方法進行md5編碼;
以上三步均通過Digest.digest()方法實現:
String digest = Digest.digest(Map map, String... keys);
傳遞的http報文體body內容如a1=b1&a2=b2&a3=b3形式的字元串,提取出需要加簽的字元串並轉成map形式。execludeKes是要排除的欄位,是一個字元串數組。
計算摘要這一步很關鍵,因為選取的欄位要求發送方和接收方必須一致,即發送方對哪些欄位計算摘要,那麼同樣地接收方也必須對相同的欄位計算摘要,否則會報6601的錯誤。
說明:a. Map是存儲了計算摘要的欄位
b. keys表示排除的欄位,不能用於計算摘要的欄位,如signature,signAlgorithm
2. 公鑰證書及字元串轉換方法
轉換的目的:便於存儲。(商戶直接提供公鑰證書也可以,但是對於向驗簽系統提供公鑰字元串的商戶,需要用下述代碼把公鑰轉成字元串)
1. 公鑰/私鑰字元串轉成公鑰/私鑰,主要是把字元串轉成公鑰PublicKey
X509EncodedKeySpec pubKeySpec = newX509EncodedKeySpec(Base64.decodeBase64(strPubKey));
KeyFactorykeyFactory = KeyFactory.getInstance(RSA);
PublicKeypubKey = keyFactory.generatePublic(pubKeySpec);
2. 公鑰或私鑰轉成Base64字元串:
StringpublicStr = Base64.encodeBase64String(pubKey.getEncoded()).trim();
3. 公私鑰驗證方法
驗證目的:公私鑰生成之後,需要驗證是否匹配。(之前許多商戶生成公私鑰混亂,無法確定公私鑰是否匹配就添加到驗簽系統中)。此代碼由用戶自己用junit驗證運行。驗證公私鑰生成是否正確,如果result為true,則說明公私鑰生成正確;否則生成的公私鑰有問題,不能使用。
String prik1 ="";
String pubb ="";
String data ="wkk";
String digest =Digest.digest(data);
PrivateKey privateKey =RSAUtil.getPrivateKey(prik1);
String sign =RSAUtil.sign(digest, privateKey);
boolean result =RSAUtil.vertiy(digest, sign,
RSAUtil.getPublicKey(pubb));
System.out.println(result);
㈦ 如何獲取數字證書(x509Certificate)中的指紋演算法
創建X509證書方法較多,在Windows 環境下大致總結了幾中辦法,
1) 通過CA獲取證書,
2) 通過微軟提供的makecert 工具得到測試證書
3) 編程的方法創建,.Net提供了 X509Certificate2 類,該類可以用於創建證書,但只能從RawData中創建,創建後無法修改除FriendlyName以外的任何屬性。
我在互聯網上找了很久,始終沒有找到完全通過程序創建自定義的證書的方法。後來想了一個折中辦法,就是用程序調用 makecert.exe 先生成一個證書,證書的一些參數如Subject,有效期,序列號等可以通過參數傳入,然後把生成的證書文件讀到Rawdata中,得到X509Certificate2 類型的證書對象。當然這種方法確實比較笨,必須要依賴外部進程。等後面有時間的話,我還是想按照X509 V3 標准,自己創建RawData,然後生成證書,這樣應該是比較靈活的做法。不知道網友們有沒有什麼更好的方法來創建一個自定義的證書。
通過 makecert.exe 創建X509證書的代碼如下,供大家參考
static object semObj = new object();
/// <summary>
/// 自定義的證書信息
/// </summary>
public class T_CertInfo
{
public String FriendlyName;
public String Subject;
public DateTime BeginDate;
public DateTime EndDate;
public int SerialNumber;
}
/// <summary>
/// 生成X509證書
/// </summary>
/// <param name="makecrtPath">makecert進程的目錄</param>
/// <param name="crtPath">證書文件臨時目錄</param>
/// <param name="certInfo">證書信息</param>
/// <returns></returns>
public static X509Certificate2 CreateCertificate(String makecrtPath, String crtPath,
T_CertInfo certInfo)
{
Debug.Assert(certInfo != null);
Debug.Assert(certInfo.Subject != null);
string MakeCert = makecrtPath + "makecert.exe";
string fileName = crtPath + "cer";
string userName = Guid.NewGuid().ToString();
StringBuilder arguments = new StringBuilder();
arguments.AppendFormat("-r -n \"{0}\" -ss my -sr currentuser -sky exchange ",
certInfo.Subject);
if (certInfo.SerialNumber > 0)
{
arguments.AppendFormat("-# {0} ", certInfo.SerialNumber);
}
arguments.AppendFormat("-b {0} ", certInfo.BeginDate.ToString(@"MM\/dd\/yyyy"));
arguments.AppendFormat("-e {0} ", certInfo.EndDate.ToString(@"MM\/dd\/yyyy"));
arguments.AppendFormat("\"{0}\"", fileName);
㈧ java程序利用根證書驗證X509用戶證書是否有效
樓上答主說的其實沒錯,只是描述的不太清楚。比如說有兩個X509Certificate類型的證書對象caCert和userCert。回
//獲取CA根證書中的公鑰
PublicKey publicKey = caCert.getPublicKey();
//使用答用戶證書驗證根證書的公鑰,如果驗證通過說明這個用戶證書是這個根證書簽發的,驗證不過就不是這個根證書簽發的。
userCert.verify(publicKey);
㈨ 什麼是X509格式的證書在java中能否使用X509Certificate對象獲得證書的私鑰信息
證書里怎麼可能有私鑰嘛,異想天開
㈩ 如何創建一個使用java X509證書嗎
SSL 連接的 context 目前用那個 KeyManager, TrustManager 的實現(Sun 公司提供的)都是默認地從命令行提供的參數或代碼中回明確初始化的 trust manager / key manager 中查答找的,這裡面可以肯定的是這個參數在連接建立之前已經固定了的靜態形式,這要求我們把可以信任的伺服器證書的頒發機構的根證書先導入到 trust store 中然後指派給 java 程序。
因此當我們的伺服器使用了一張不在 trust store 中的信任根證書機構名錄中的證書是不會被信任的,因此我們必須提供一個有別於 Sun 的 Trust Manager 介面的實現類,然後像 IE 瀏覽器那樣在查找證書來確認是否信任時彈出一個對話框出來讓用戶檢查,當用戶點擊「以後一直信任該證書的廠商」時我們把它緩存在持久性介質(比如文件或資料庫)中,下次訪問時先看是否有緩存的,沒有再來彈對話框讓用戶確認,當伺服器要求客戶端出示客戶端證書時(比如網銀業務)我們同樣需要提供自己的 key manager 實現。