pfxjava
1. java客戶端怎麼訪問帶有pfx格式證書的https網站(伺服器)呢,
使用HttpURLConnection訪問https地址。
以下是導入JKS證書的方式,可以參考。
Stringkeystorefile="file";
Stringkeystorepw="password";
Stringkeypw="password";
KeyStorekeystore=KeyStore.getInstance("JKS");
keystore.load(newFileInputStream(keystorefile),keystorepw.toCharArray());
=KeyManagerFactory.getInstance("SunX509");
keymanagerfactory.init(keystore,keypw.toCharArray());
KeyManagerakeymanager[]=keymanagerfactory.getKeyManagers();
=TrustManagerFactory.getInstance("SunX509");
trustmanagerfactory.init(keystore);
TrustManageratrustmanager[]=trustmanagerfactory.getTrustManagers();
sslcontext=SSLContext.getInstance("TLS");
sslcontext.init(akeymanager,atrustmanager,null);
sslSocketFactory=sslcontext.getSocketFactory();
Stringurl="asdfdf";
URLtestURL=newURL(url);
=(HttpURLConnection)testURL.openConnection();
if(){
HttpsURLConnectionconn=(HttpsURLConnection)urlConnection;
conn.setSSLSocketFactory(sslSocketFactory);
}
2. java如何生成.pfx文件java語言可以生成pfx文件嗎
/**
* 證書私鑰存儲設施碼脊基
*
* @param alias
* KeyStore別名
* @param key
* 密鑰(這里是私遲謹鑰)
* @param password
* 保存密碼
* @param chain
* 證野棗書鏈
* @param filePath
* PFX文件路徑
* @throws KeyStoreException
* @throws NoSuchAlgorithmException
* @throws CertificateException
* @throws IOException
*/
private void createKeyStore(String alias, Key key, char[] password,
Certificate[] chain, String filePath) throws KeyStoreException,
NoSuchAlgorithmException, CertificateException, IOException {
KeyStore keyStore = KeyStore.getInstance("pkcs12");
keyStore.load(null, password);
keyStore.setKeyEntry(alias, key, password, chain);
FileOutputStream fos = new FileOutputStream(filePath);
keyStore.store(fos, password);
fos.close();
}
3. pfx證書文件能直接使用嗎
不能直清猛族接使用pfx證書的,
需要去java網站上下一個keytools工具,導入pfx證書後才能使用。cer和pfx是成對的,你做了個cer的話必然會同時生成一個pfx,不曉得你的cer是怎麼做的。一般來說是這樣的,你先用一些工具,比如剛才說的java的keytools,或者IIS生成一個密鑰請求crs,然後把這個crs發送給密鑰發放的CA,你可答弊以自己知悶搭一個CA或者去買一個,CA會再發給你一個確認後的證書,你再使用這個確認後的cer來結束證書申請過程,最終得到一個私鑰和一個密鑰
4. java如何對pdf文件實現數字簽名
用Spire.Doc for Java 可以添加及驗證數字簽名,參考代碼:
importcom.spire.pdf.*;
importcom.spire.pdf.graphics.PdfImage;
importcom.spire.pdf.graphics.PdfTrueTypeFont;
importcom.spire.pdf.security.GraphicMode;
importcom.spire.pdf.security.PdfCertificate;
importcom.spire.pdf.security.PdfCertificationFlags;
importcom.spire.pdf.security.PdfSignature;
importjava.awt.*;
importjava.awt.geom.Point2D;
importjava.awt.geom.Rectangle2D;
publicclassAddCertificate{
publicstaticvoidmain(String[]args){
//載入PDF文檔
PdfDocumentdoc=newPdfDocument();
doc.loadFromFile("test.pdf");
//載入pfx證書,及證書秘鑰
PdfCertificatecert=newPdfCertificate("Cermia.pfx","123654yes!");
//添加數字簽名到指定頁面,並設置其位置和大小
PdfSignaturesignature=newPdfSignature(doc,doc.getPages().get(2),cert,"MySignature");
Rectangle2Drect=newRectangle2D.Float();
rect.setFrame(newPoint2D.Float((float)doc.getPages().get(0).getActualSize().getWidth()-340,(float)doc.getPages().get(0).getActualSize().getHeight()-230),newDimension(280,150));
signature.setBounds(rect);
//設置簽名為圖片加文本模式
signature.setGraphicMode(GraphicMode.Sign_Image_And_Sign_Detail);
//設置簽名的內容
signature.setNameLabel("簽字者:");
signature.setName("Mia");
signature.setContactInfoLabel("聯系電話:");
signature.setContactInfo("02881705109");
signature.setDateLabel("日期:");
signature.setDate(newjava.util.Date());
signature.setLocationInfoLabel("地點:");
signature.setLocationInfo("成都");
signature.setReasonLabel("原因:");
signature.setReason("文檔所有者");
signature.setDistinguishedNameLabel("DN:");
signature.setDistinguishedName(signature.getCertificate().get_IssuerName().getName());
signature.setSignImageSource(PdfImage.fromFile("sign.png"));
//設置簽名的字體
signature.setSignDetailsFont(newPdfTrueTypeFont(newFont("ArialUnicodeMS",Font.PLAIN,9)));
//設置文檔許可權為禁止更改
signature.setDocumentPermissions(PdfCertificationFlags.Forbid_Changes);
signature.setCertificated(true);
//保存文檔
doc.saveToFile("AddSignature.pdf");
doc.close();
}
}
數字簽名添加效果:
數字簽名效果
參考原文
5. 證書中的jks、pfx和cer後綴都是什麼文件
jks是JAVA的keytools證書工具支持的證書私鑰格式。
pfx是微軟支持的私鑰格式。
cer是證書的公鑰。
如果是你私人要備份證書的話記得一定要備份成者態陵jks或者pfx格式,否則恢復不了。
簡單來說,cer就是你們家郵箱的地址,你可以把這個地址給很多人讓他們往裡面發信。
pfx或jks就是你家郵箱的鑰匙閉答,別人有了這個就可以冒充你去你家郵箱看信,你丟了這首戚個也沒法開郵箱了。
6. 關於公私鑰、各種證書、https基本概念掃盲
最近實習需要寫一些生成證書的腳本,藉此機會順便搞清楚了許多關於證書這塊的疑惑。說到這一塊東西,名詞多到爆炸,對稱加密、非對稱加密、密鑰、密鑰庫、公鑰、私鑰、CA、證書、數字簽名、ssh、https、ssl、keytool、openssl、PKCS、X.509以及令人眼花繚亂的文件後綴名,cer、crt、pem、keystore、jks、key、p12、pfx...
先聽我講個故事,這次我們不用Bob和Alice,聽完之後再去看這些概念,絕壁恍然大悟。
故事背景: 這是2018年,為了能夠安全的進行通信,假設每個人都有倆把鎖,一個叫A鎖,一個叫B鎖,這倆把鎖和一般的鎖有點區別,每把鎖上即帶有自己的鎖孔又帶有另一把鎖的鑰匙,因此A鎖和B鎖既是鎖又是鑰匙。 A鎖和B鎖唯一配對,A鎖鎖住之後,只有B鎖可以打開,同樣B鎖鎖住之後,只有A鎖可以打開 。其中一把鎖是公開的,而一把鎖則自己保管,不公開。假設默認A鎖是公開的,B鎖是私有的。
故事內容: 阿里巴巴子弟小學的小明想給隔壁班的小花寫封表白信,為了不被別人看到,他將信放入在信箱中,並用小花的A鎖將信箱鎖住,因為小花的B鎖(同是A鎖的鑰匙)只有小花自己有,所以除了小花以外的任何人拿到信件,都無法看到信件內容。同樣小花要給小明寫信,那麼也要用小明的A鎖對信件內容進行保護。
小明與小花通過就這樣聊了有一段時間,後來小花覺得差不多了,可以進入秀恩愛的階段了,跟小明說,以後寫信別tm加密了,又不是銀行卡密碼,被人看到又能怎麼樣呢?只要看了之後別瞎改就行了。於是小明在寫完信後,把信里每個字的拼音首字母拼湊了一個字元串,並取名為 消息摘要 ,然後僅僅將消息摘要放入信箱,用自己的B鎖鎖住這個信箱。雖然信件本身沒有放入安全的信箱,但小明作為一個情書高手,隨便一封信都是上萬字,如果其他人對信件內容做任何改變,那麼拼音首字母組成的字元串幾乎肯定會改變,因此小花拿到信件後,先用小明的A鎖(B鎖的鑰匙)打開信箱,拿到小明的摘要,然後小花再對信件內容做同樣的處理(即計算信件每個字的拼音首字母,實際上不會用這么簡單的演算法,而是會用不可逆的hash演算法),計算出的字元串值如與小明的信息摘要一致,說明這封信就是小明寫給自己的,沒有被任何人篡改。
故事高潮: 事情並沒有那麼簡單,小花發現小明只是在信件里對自己熱情似火,平常見了面連聲招呼都不打,一副不認識的樣子。終於有一天小花忍不住了,當面質問小明,小明卻說,我什麼時候給你寫情書了,自作多情吧...於是小花把昨天剛收到的情書狠狠甩在了小明臉上:「上面落款不是你小明嗎?怎麼了,慫了?」小明一看上面還真是自己的名字,但是自己寫沒寫信自己還不知道嗎?小明把自己的作業本拿給小花,並叫自己的同桌做筆跡鑒定,小花發現筆跡的確不大像,看來是有人惡作劇,冒充小明給自己寫情書,哎,好尷尬啊。。。
故事講完了,文章開頭涉及的所有概念都與信息的安全傳輸有關,可以說,一切都是為了安全。關於通信安全,我們通常有三個基本的需求
我們以上面的故事為例說一下這三點安全需求,一開始小明與小花通過A鎖( 對應公鑰 )加密,B鎖( 對應私鑰 )解密的通信方式即符合第一點,信件內容本身被加密,而因為公私鑰唯一配對,只有配對的密鑰才可以解密,因此很難被第三人破解。
之後,為了秀恩愛,他們採用了B鎖( 私鑰 )加密,A鎖( 公鑰 )解密的通信方式,其中用私鑰對消息摘要加密後的字元串稱為 數字簽名 ,這樣雖然信件可以被人直接看到,但如果被人篡改掉後可以輕易發現數據被篡改。本來以為滿足第一條和第二條就可以安全的通信了,但最後才發現小明根本不是小明!為什麼會出現這樣的問題?因為「小明」說他是小明,小花就以為他是小明,他沒有提供任何證明自己真的是小明的認證。因此要想安全通信,我們還需要一個權威第三方的機構來做身份認證,這個機構就是CA機構,通過認證後,CA機構會頒發權威的證書,而有了證書就可以證明身份,就不會出現身份被假冒的情況。而認證的過程則需要向CA機構提供自己的身份信息以及私鑰。
對稱加密就是通信雙方或多方採用的密鑰是一樣的。加解密速度快,但不夠安全。因為一旦密鑰泄露,誰都可以對數據進行解密。非對稱加密就是當然就是通信雙方使用的密鑰不同。而公鑰和私鑰就是非對稱加密的一種方式。比較常用的對稱加密演算法如
AES、DES,非對稱加密比較常見的則有sha256,RSA。
非對稱加密演算法有倆個密鑰,一個公鑰,一個私鑰。公鑰和私鑰必須配對出現,一對公鑰和一個私鑰統稱為一個 密鑰 ,而 密鑰庫 中可以存放多個密鑰,即多對公私鑰。
如果你用github的話,應該注意到github鏈接有倆種方式。一種是https,一種是ssh,通過https經常需要輸密碼,而通過ssh則不需要。回憶你設置ssh的步驟,本地生成了一個密鑰對,並將公鑰上傳到了github。每次傳輸用自動本地私鑰加密,伺服器用你上傳的公鑰解密,就不需要手動輸入密碼了。
keytool和openssl是倆個證書管理工具.keytool是java JDK自帶的證書管理工具,使用keytool可以生成密鑰,創建證書。只要裝了jdk,並正確設置了環境變數,就可以之間通過命令行執行keytool命令來管理證書。
openssl則是一個開源的安全套接字層密碼庫,功能比keytool更加豐富。
PKCS全稱Public-Key Cryptography Standards 即公鑰標准,PKCS已經發布了15個標准。
PKCS#12 包含了公鑰和私鑰的二進制格式的證書形式,以pfx作為證書文件後綴
X.509 則是一個通用的證書標准,規定了證書應該包含哪些內容,X.509通常有倆種編碼方式,一種是二進制編碼,另一種是base64編碼
X.509#DER 二進制格式證書,常用後綴.cer .crt
X.509#PEM 文本格式證書,常用後綴.pem
因為http是明文傳輸,非常不安全,因此又提出了ssl(Secure Sockets Layer即安全套接字)層協議,即在原來的基礎上又加了一層協議用於保障安全傳輸,可以認為https=ssl+http。很多人剛開始接觸https,用瀏覽器F12打開控制台後。可能發現數據仍然沒有加密。要注意https是 傳輸層加密 ,瀏覽器F12控制台你看到的還是應用層的數據。
因為本文主要是概念掃盲,幫助理解,因此關於這部分具體細節不作介紹。
.keystore和.jks和.truststore都是java用來存放密鑰的文件
.key nginx中私鑰文件
而不同的證書文件後綴都是為了區分不同種類的證書的,主要有倆個分類維度
7. Java如何讀取PFX密鑰文件
package com.Jinhill;
import java.io.*;
import java.util.*;
import java.security.*;
import java.security.cert.Certificate;
public class ReadPFX {
public ReadPFX (){
}
//局閉轉換成十六進制字元串
public static String Byte2String(byte[] b) {
String hs="";
String stmp="";
for (int n=0;n<b.length;n++) {
stmp=(java.lang.Integer.toHexString(b[n] & 0XFF));
if (stmp.length()==1) hs=hs+"0"+stmp;
else hs=hs+stmp;
//if (n<b.length-1) hs=hs+":";
}
return hs.toUpperCase();
}
public static byte[] StringToByte(int number) {
int temp = number;
byte[] b=new byte[4];
for (int i=b.length-1;i>-1;i--){
b[i] = new Integer(temp&0xff).byteValue();//將最高位保存在最低位
temp = temp >> 8; //向右移8位
}
return b;
}
private PrivateKey GetPvkformPfx(String strPfx, String strPassword){
try {
KeyStore ks = KeyStore.getInstance("PKCS12");
FileInputStream fis = new FileInputStream(strPfx);
// If the keystore password is empty(""), then we have to set
/桐敏裂/ to null, otherwise it won't work!!!
char[] nPassword = null;
if ((strPassword == null) || strPassword.trim().equals("")){
nPassword = null;
}
else
{
nPassword = strPassword.toCharArray();
}
ks.load(fis, nPassword);
fis.close();
System.out.println("keystore type=" + ks.getType());
// Now we loop all the aliases, we need the alias to get keys.
// It seems that this value is the "Friendly name" field in the
//拿仔 detals tab <-- Certificate window <-- view <-- Certificate
// Button <-- Content tab <-- Internet Options <-- Tools menu
// In MS IE 6.
Enumeration enumas = ks.aliases();
String keyAlias = null;
if (enumas.hasMoreElements())// we are readin just one certificate.
{
keyAlias = (String)enumas.nextElement();
System.out.println("alias=[" + keyAlias + "]");
}
// Now once we know the alias, we could get the keys.
System.out.println("is key entry=" + ks.isKeyEntry(keyAlias));
PrivateKey prikey = (PrivateKey) ks.getKey(keyAlias, nPassword);
Certificate cert = ks.getCertificate(keyAlias);
PublicKey pubkey = cert.getPublicKey();
System.out.println("cert class = " + cert.getClass().getName());
System.out.println("cert = " + cert);
System.out.println("public key = " + pubkey);
System.out.println("private key = " + prikey);
return prikey;
}
catch (Exception e)
{
e.printStackTrace();
}
return null;
}
}