JAVA生成X509證書

Java生成RSA密鑰對(duì)的兩種方法:

1台汇、RSAPublicKeySpec和RSAPrivateCrtKeySpec

這兩個(gè)API是JAVA安全模塊自帶的API亭姥,可以查看API的相關(guān)說(shuō)明:

public RSAPublicKeySpec(BigInteger modulus,BigInteger

publicExponent)

創(chuàng)建一個(gè)新的RSAPublicKeySpec稼钩。

參數(shù)

modulus - 模數(shù)

publicExponent - 公鑰指數(shù)

publicRSAPrivateCrtKeySpec(BigInteger modulus,

??????????????????????????? BigIntegerpublicExponent,

??????????? ????????????????BigInteger privateExponent,

??????????????????????????? BigInteger primeP,

??????????????????????????? BigInteger primeQ,

??????????????????????????? BigIntegerprimeExponentP,

??????????????????????????? BigIntegerprimeExponentQ,

??????? ????????????????????BigInteger crtCoefficient)

創(chuàng)建一個(gè)新的RSAPrivateCrtKeySpec給定在PKCS#1中定義的模數(shù),publicExponent达罗,privateExponent坝撑,primeP,primeQ粮揉,primeExponentP巡李,primeExponentQ和crtCoefficient。

參數(shù)

modulus - 模數(shù)n

publicExponent - 公鑰指數(shù)e

privateExponent -私鑰指數(shù)d

primeP - n的素因子p

primeQ - n的素因子q

primeExponentP - 這是d mod(p-1)

primeExponentQ - 這是d mod(q-1)

crtCoefficient - 剩余定理系數(shù)q-1 mod p

示例代碼如下:

// 創(chuàng)建指定公鑰的對(duì)象

RSAPublicKeySpec localRSAPublicKeySpec1 =

new RSAPublicKeySpec(new

BigInteger("b4a7e46170574f16a97082b22be58b6a2a629798419be12872a4bdba626cfae9900f76abfb12139dce5de56564fab2b6543165a040c606887420e33d91ed7ed7",

16), new BigInteger("11", 16));

// 創(chuàng)建指定私鑰的對(duì)象

RSAPrivateCrtKeySpec

localRSAPrivateCrtKeySpec1 = new RSAPrivateCrtKeySpec(new

BigInteger("b4a7e46170574f16a97082b22be58b6a2a629798419be12872a4bdba626cfae9900f76abfb12139dce5de56564fab2b6543165a040c606887420e33d91ed7ed7",

16), new BigInteger("11", 16), new

BigInteger("9f66f6b05410cd503b2709e88115d55daced94d1a34d4e32bf824d0dde6028ae79c5f07b580f5dce240d7111f7ddb130a7945cd7d957d1920994da389f490c89",

16), new

BigInteger("c0a0758cdf14256f78d4708c86becdead1b50ad4ad6c5c703e2168fbf37884cb",

16), new BigInteger("f01734d7960ea60070f1b06f2bb81bfac48ff192ae18451d5e56c734a5aab8a5",

16), new

BigInteger("b54bb9edff22051d9ee60f9351a48591b6500a319429c069a3e335a1d6171391",

16), new BigInteger("d3d83daf2a0cecd3367ae6f8ae1aeb82e9ac2f816c6fc483533d8297dd7884cd",

16), new BigInteger("b8f52fc6f38593dabb661d3f50f8897f8106eee68b1bce78a95b132b4e5b5d19",

16));

// 創(chuàng)建指定RSA算法的密鑰工廠扶认,指定工廠為BC

KeyFactory localKeyFactory =

KeyFactory.getInstance("RSA", "BC");

// 生成私鑰

PrivateKey localPrivateKey1 =

localKeyFactory.generatePrivate(localRSAPrivateCrtKeySpec1);

// 生成公鑰

PublicKey localPublicKey1 =

localKeyFactory.generatePublic(localRSAPublicKeySpec1);

2侨拦、KeyPair 和KeyPairGenerator

KeyPairGenerator類用于生成公鑰和私鑰對(duì)。 密鑰對(duì)生成器使用getInstance工廠方法(返回給定類的實(shí)例的靜態(tài)方法)構(gòu)造辐宾。

用于特定算法的密鑰對(duì)生成器創(chuàng)建可以與該算法一起使用的公鑰/私鑰對(duì)狱从。 它還將算法特定的參數(shù)與生成的每個(gè)密鑰相關(guān)聯(lián)。

生成密鑰對(duì)的方法有兩種:以算法無(wú)關(guān)的方式叠纹,并以算法特定的方式季研。

publicKeyPair(PublicKey publicKey, PrivateKey privateKey)

從給定的公鑰和私鑰構(gòu)造一個(gè)密鑰對(duì)。

請(qǐng)注意誉察,此構(gòu)造函數(shù)僅存儲(chǔ)對(duì)生成的密鑰對(duì)中的公鑰和私鑰組件的引用与涡。 這是安全的,因?yàn)镵ey對(duì)象是不可變的冒窍。

參數(shù)

publicKey - 公鑰递沪。

privateKey - 私鑰。

示例代碼如下:

// 生成RSA公私鑰對(duì)

KeyPairGenerator kpg = null;

// 采用 RSA 非對(duì)稱算法加密

kpg =KeyPairGenerator.getInstance("RSA");

// 初始化為2048 位

kpg.initialize(2048);

KeyPair keyPair = kpg.generateKeyPair();

// 公鑰

PublicKey pubKey =localKeyFactory.generatePublic(localRSAPublicKeySpec1);

// 私鑰

PrivateKey priKey = keyPair.getPrivate();

3综液、完整的示例代碼

packagecom.test;

importjava.io.File;

importjava.io.FileOutputStream;

importjava.io.IOException;

importjava.math.BigInteger;

importjava.security.KeyPair;

importjava.security.KeyPairGenerator;

importjava.security.PrivateKey;

importjava.security.PublicKey;

importjava.security.Security;

importjava.security.cert.CertificateEncodingException;

import java.security.cert.X509Certificate;

importjava.util.Calendar;

importjava.util.Date;

importjava.util.Hashtable;

importjava.util.Vector;

importorg.bouncycastle.asn1.x509.KeyUsage;

importorg.bouncycastle.asn1.x509.X509Extension;

importorg.bouncycastle.jce.X509Principal;

importorg.bouncycastle.jce.provider.BouncyCastleProvider;

importorg.bouncycastle.x509.X509V3CertificateGenerator;


@SuppressWarnings("deprecation")

public class GenCrt {

? /**

?? ?*BouncyCastleProvider

?? ?*/

?? static {

????? Security.addProvider(new BouncyCastleProvider());

?? }

?/**

?? ?*生成 X509 證書

?? ?*@param user

?? ?*@return

?? ?*/

?? @SuppressWarnings({ "deprecation", "unchecked" })

?? public static byte[] generateCert() {

????? X509Certificatecert = null;

????? X509V3CertificateGeneratorcertGen=new X509V3CertificateGenerator();

????? try {

???????? // 生成RSA公私鑰對(duì)

???????? KeyPairGeneratorkpg = null;

???????? // 采用 RSA 非對(duì)稱算法加密

???????? kpg= KeyPairGenerator.getInstance("RSA");


???????? // 初始化為2048 位

???????? kpg.initialize(2048);


???????? KeyPairkeyPair = kpg.generateKeyPair();

???????? // 公鑰

???????? PublicKeypubKey = keyPair.getPublic();

???????? // 私鑰

???????? PrivateKeypriKey = keyPair.getPrivate();


???????? // 公鑰

???????? certGen.setPublicKey(pubKey);

???????? // 設(shè)置序列號(hào)

???????? certGen.setSerialNumber(new BigInteger("12345678"));

???????? // 設(shè)置頒發(fā)者信息

???????? @SuppressWarnings("rawtypes")

???????? HashtablekwMapIssuer = new Hashtable();

????? ??? @SuppressWarnings("rawtypes")

???????? VectorlocalVector = new Vector();

???????? kwMapIssuer.put(X509Principal.C,"CN");

???????? localVector.addElement(X509Principal.C);

???????? kwMapIssuer.put(X509Principal.CN,"wuwu");

???????? localVector.addElement(X509Principal.CN);

???????? kwMapIssuer.put(X509Principal.E, "111@qq.com");

???????? localVector.addElement(X509Principal.E);

???????? certGen.setIssuerDN(new X509Principal(localVector, kwMapIssuer));

???????? //? 設(shè)置申請(qǐng)者信息

???????? @SuppressWarnings("rawtypes")

???????? HashtablekwMapApplicant = new Hashtable();

????? ??? @SuppressWarnings("rawtypes")

???????? VectorlocalVectorApplicant = new Vector();

???????? kwMapApplicant.put(X509Principal.C,"CN");

???????? localVectorApplicant.addElement(X509Principal.C);

???????? kwMapApplicant.put(X509Principal.CN,"wlhl");

???????? localVectorApplicant.addElement(X509Principal.CN);

???????? kwMapApplicant.put(X509Principal.E, "123@qq.com");

???????? localVectorApplicant.addElement(X509Principal.E);

???????? certGen.setSubjectDN(new X509Principal(localVectorApplicant, kwMapApplicant));

???????? // 設(shè)置有效期

???????? Calendarc= Calendar.getInstance();

???????? c.set(Calendar.DAY_OF_YEAR, c.get(Calendar.DAY_OF_YEAR) + 7000);

???????? certGen.setNotBefore(new Date());

???????? certGen.setNotAfter(c.getTime());

???????? // 設(shè)置擴(kuò)展域款慨,密鑰用途

???????? certGen.addExtension(X509Extension.keyUsage, false, new?KeyUsage(KeyUsage.digitalSignature));

??????????? // 簽名算法

???????? certGen.setSignatureAlgorithm("SHA256WithRSAEncryption");

???????? cert = certGen.generateX509Certificate(priKey, "BC");

????? }catch (Exception e) {

???????? System.out.println(e.getClass() + e.getMessage());

????? }

????? try {

???????? return cert.getEncoded();

????? }catch (CertificateEncodingException e) {

???????? // TODO Auto-generated catch block

???????? e.printStackTrace();

???????? return null;

????? }

?? }

?? /**

?? ?*寫文件

?? ?*@param name

?? ?*@param data

?? ?*/

?? static public void writeFile(String name, byte[] data) {

????? if(data == null)

????? {

???????? return;

????? }

????? FileOutputStreamfop = null;

????? try {

???????? fop = new FileOutputStream(new File(name));

???????? fop.write(data);

???????? fop.close();

????? }catch (IOException e) {

???????? // TODO Auto-generated catch block

???????? e.printStackTrace();

????? }

?? }

?? public static void main(String[] args) {

????? // TODOAuto-generated method stub

????? byte[] crtBuf=generateCert();

????? if(crtBuf != null) {

???????? writeFile("./TestCrt.crt", crtBuf);

????? }

?? }


}


生成后的效果:


?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市谬莹,隨后出現(xiàn)的幾起案子檩奠,更是在濱河造成了極大的恐慌桩了,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,406評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件埠戳,死亡現(xiàn)場(chǎng)離奇詭異井誉,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)整胃,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,732評(píng)論 3 393
  • 文/潘曉璐 我一進(jìn)店門颗圣,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人屁使,你說(shuō)我怎么就攤上這事在岂。” “怎么了蛮寂?”我有些...
    開封第一講書人閱讀 163,711評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵蔽午,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我酬蹋,道長(zhǎng)及老,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,380評(píng)論 1 293
  • 正文 為了忘掉前任范抓,我火速辦了婚禮骄恶,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘尉咕。我一直安慰自己叠蝇,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,432評(píng)論 6 392
  • 文/花漫 我一把揭開白布年缎。 她就那樣靜靜地躺著悔捶,像睡著了一般。 火紅的嫁衣襯著肌膚如雪单芜。 梳的紋絲不亂的頭發(fā)上蜕该,一...
    開封第一講書人閱讀 51,301評(píng)論 1 301
  • 那天,我揣著相機(jī)與錄音洲鸠,去河邊找鬼堂淡。 笑死,一個(gè)胖子當(dāng)著我的面吹牛扒腕,可吹牛的內(nèi)容都是我干的绢淀。 我是一名探鬼主播,決...
    沈念sama閱讀 40,145評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼瘾腰,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼皆的!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起蹋盆,我...
    開封第一講書人閱讀 39,008評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤费薄,失蹤者是張志新(化名)和其女友劉穎硝全,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體楞抡,經(jīng)...
    沈念sama閱讀 45,443評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡伟众,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,649評(píng)論 3 334
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了召廷。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片凳厢。...
    茶點(diǎn)故事閱讀 39,795評(píng)論 1 347
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖竞慢,靈堂內(nèi)的尸體忽然破棺而出数初,到底是詐尸還是另有隱情,我是刑警寧澤梗顺,帶...
    沈念sama閱讀 35,501評(píng)論 5 345
  • 正文 年R本政府宣布,位于F島的核電站车摄,受9級(jí)特大地震影響寺谤,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜吮播,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,119評(píng)論 3 328
  • 文/蒙蒙 一变屁、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧意狠,春花似錦粟关、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,731評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至院塞,卻和暖如春遮晚,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背拦止。 一陣腳步聲響...
    開封第一講書人閱讀 32,865評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工县遣, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人汹族。 一個(gè)月前我還...
    沈念sama閱讀 47,899評(píng)論 2 370
  • 正文 我出身青樓萧求,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親顶瞒。 傳聞我的和親對(duì)象是個(gè)殘疾皇子夸政,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,724評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容

  • 嘟噥嘟噥:最近接到一個(gè)任務(wù):在客戶端動(dòng)態(tài)生成RSA密鑰對(duì),然后向服務(wù)器發(fā)送這個(gè)密鑰對(duì)中的公鑰字符串搁拙,由服務(wù)器進(jìn)行公...
    TimmyR閱讀 8,031評(píng)論 19 21
  • Base64.java public final class Base64 { static private ...
    BUG弄潮兒閱讀 795評(píng)論 0 0
  • 本文主要是前面《java實(shí)現(xiàn)雙向RSA + AES加密》的補(bǔ)充秒梳,只補(bǔ)充新增的代碼法绵, JDK中自帶了橢圓曲線的簽名,...
    終結(jié)者_(dá)8d5e閱讀 3,784評(píng)論 0 1
  • 謹(jǐn)以此文獻(xiàn)給逝去的青春酪碘。 人物介紹 慕言: 凌恒: 褚明庭: 葉思弦: 在這帶著微熱氣息的季節(jié)朋譬,慕言就要開啟自己的...
    廢材小可愛閱讀 496評(píng)論 0 0
  • Rango_d2a4閱讀 128評(píng)論 0 0