java 生成证书 pkcs12_PKCS12 证书的生成及验证

本文首先感谢 Apple 开发者论坛的eskimo1,他是我见过的最热心肠的人,对任何人他都不吝于给予无私帮助。

服务器生成PKCS12证书库,并通过servlet导出为DER客户端证书(含一个密钥和一个证书)。iPhone从服务器下载证书后,如何进行验证?

一、

生成证书

假设密钥库为dlt.p12,库密码ipcc@95598,有效期1天,则命令为:

keytool -genkey -v

-alias root -keyalg RSA -storetype PKCS12 -keystore dlt.p12 -dname "CN=www.handtimes.com,OU=ipcc,O=云电同方,L=昆明,ST=云南,C=中国"

-storepass ipcc@95598 -keypass ipcc@95598

生成客户端用的证书:

keytool -genkey -v

-alias p12client -keyalg RSA -storetype PKCS12 -keystore dlt.p12 -dname

"CN=www.handtimes.com,OU=ipcc,O=云电同方,L=昆明,ST=云南,C=中国" -storepass ipcc@95598

-keypass 123456 -validity 1

要查看已生成的证书,用下面的命令:

keytool -list -v

-alias p12client -keystore dlt.p12 -storepass ipcc@95598 -storetype PKCS12

或者:

keytool -list -v

-keystore IPCCCA

dlt.p12 ipcc@95598 -storetype PKCS12

如果需要将p12证书导出为.cer格式,可以使用命令:

keytool -export

-alias p12client -keystore dlt.p12 -storetype PKCS12 -storepass ipcc@95598 -rfc

-file p12.cer

查看.cer文件:

keytool -printcert

-v -file /Users/kmyhy/Desktop/client.cer

如果需要将keystore中的私钥导出为.p12格式:

Keytool.exe

-importkeystore -srckeystore IPCCCA -srcstoretype jks -srcstorepass ipcc@95598 -srcalias

p12client

-destkeystore dltclient.p12

-deststoretype pkcs12 -deststorepass ipcc@95598 -destkeypass 123456

validity 3

注意,keytool用的是jdk1.6提供的版本。此时命令提示忽略用户输入的destkeypass密码:

0_13057748026dj9.gif

重新输入密码123456,回车,将在用户主目录下生成dltclient.p12文件。

查看dltclient.p12内容:

keytool.exe -list

-keystore dltclient.p12 -storepass ipcc@95598 -storetype pkcs12

可以看到如下输出:

0_1305774857vB0C.gif

可以看到其中包含了证书和私钥,并且其认证指纹是和IPCCCA中的一模一样的。

一、

提供证书下载

先把生成的p12证书库dlt.p12放到服务器目录下。

新建一个Servlet:GetP12Cert。

public

class

GetP12Cert

extends

HttpServlet {

private

static

final

long

serialVersionUID

= 1L;

private

static

final

int

max_days

=1;

/**

*

@see

HttpServlet#HttpServlet()

*/

public

GetP12Cert() {

super

();

//

TODO

Auto-generated constructor stub

}

/**

*

@see

HttpServlet#doGet(HttpServletRequest

request, HttpServletResponse response)

*/

protected

void

doGet(HttpServletRequest

request, HttpServletResponse response)

throws

ServletException, IOException {

String filename=

"C://Documents and

Settings//Administrator//dlt.cer"

;

String pass=

"ipcc@95598"

;

Pkcs12Manager man=

null

;

String alias=

"p12client"

;

String keypass=

"123456"

;

try

{

man=

new

Pkcs12Manager(

new

File(filename),pass);

man.updateExpiration(alias,

keypass,

max_days

);

exportCert(man,alias,response);

//

man.saveCert(alias,

"123456");

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
使用PKCS#10格式的证书请求申请PKI证书的一般步骤如下: 1. 生成PKCS#10格式的证书请求,可以使用Java的`sun.security.pkcs10.PKCS10`类完成,示例代码如下: ```java import java.io.IOException; import java.security.*; import java.security.cert.CertificateException; import java.security.cert.X509Certificate; import sun.security.pkcs10.PKCS10; import sun.security.x509.X500Name; public class PKCS10Generator { public static void main(String[] args) throws NoSuchAlgorithmException, InvalidKeyException, SignatureException, CertificateException, IOException { KeyPairGenerator keyPairGen = KeyPairGenerator.getInstance("RSA"); keyPairGen.initialize(2048); KeyPair keyPair = keyPairGen.generateKeyPair(); PrivateKey privateKey = keyPair.getPrivate(); PublicKey publicKey = keyPair.getPublic(); X500Name subject = new X500Name("CN=example.com,O=Example Inc.,L=San Francisco,ST=California,C=US"); PKCS10 pkcs10 = new PKCS10(publicKey); Signature signature = Signature.getInstance("SHA256withRSA"); signature.initSign(privateKey); pkcs10.encodeAndSign(subject, signature); byte[] p10 = pkcs10.getEncoded(); // 将p10保存到本地文件或发送到证书颁发机构(CA)进行签发 } } ``` 这个示例代码生成一个2048位的RSA密钥对,并使用`sun.security.pkcs10.PKCS10`类生成PKCS#10格式的证书请求,其中的`X500Name`类用于指定证书主题,签名算法使用的是`SHA256withRSA`。 2. 将生成的PKCS#10格式的证书请求发送到证书颁发机构(CA)进行签发。CA会验证证书请求的合法性,并为其签发PKI证书。一般情况下,CA会要求申请人提供一些证明身份的材料,例如身份证、营业执照等。 3. 在申请到PKI证书之后,使用Java的`java.security.KeyStore`类将证书导入到Keystore中,示例代码如下: ```java import java.io.FileInputStream; import java.security.KeyStore; import java.security.cert.Certificate; public class PKIImport { public static void main(String[] args) throws Exception { String keystoreFile = "/path/to/keystore.jks"; String keystorePassword = "password"; String alias = "alias"; String certFile = "/path/to/cert.cer"; FileInputStream is = new FileInputStream(certFile); CertificateFactory cf = CertificateFactory.getInstance("X.509"); Certificate cert = cf.generateCertificate(is); is.close(); KeyStore ks = KeyStore.getInstance("JKS"); ks.load(new FileInputStream(keystoreFile), keystorePassword.toCharArray()); ks.setCertificateEntry(alias, cert); ks.store(new FileOutputStream(keystoreFile), keystorePassword.toCharArray()); } } ``` 这个示例代码从指定路径的证书文件中读取PKI证书,然后将证书导入到指定路径的Keystore中。在实际应用中,Keystore一般会使用密码进行保护。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值