- 浏览: 1506137 次
- 性别:
- 来自: 南京
文章分类
- 全部博客 (419)
- XMPP (19)
- Android (180)
- Java (59)
- Network (4)
- HTML5 (13)
- Eclipse (9)
- SCM (23)
- C/C++ (4)
- UML (4)
- Libjingle (15)
- Tools&Softwares (29)
- Linphone (5)
- Linux&UNIX (6)
- Windows (18)
- Google (10)
- MISC (3)
- SIP (6)
- SQLite (5)
- Security (4)
- Opensource (29)
- Online (2)
- 文章 (3)
- MemoryLeak (10)
- Decompile (5)
- Ruby (1)
- Image (1)
- Bat (4)
- TTS&ASR (28)
- Multimedia (1)
- iOS (20)
- Asciiflow - ASCII Flow Diagram Tool.htm (1)
- Networking (1)
- DLNA&UPnP (2)
- Chrome (2)
- CI (1)
- SmartHome (0)
- CloudComputing (1)
- NodeJS (3)
- MachineLearning (2)
最新评论
-
bzhao:
点赞123!
Windows的adb shell中使用vi不乱码方法及AdbPutty -
wahahachuang8:
我觉得这种东西自己开发太麻烦了,就别自己捣鼓了,找个第三方,方 ...
HTML5 WebSocket 技术介绍 -
obehavior:
view.setOnTouchListenerview是什么
[转]android 一直在最前面的浮动窗口效果 -
wutenghua:
[转]android 一直在最前面的浮动窗口效果 -
zee3.lin:
Sorry~~
When I build "call ...
Step by Step about How to Build libjingle 0.4
http://blog.csdn.net/kmyhy/article/details/6431609
本文首先感谢 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密码:
重新输入密码123456,回车,将在用户主目录下生成dltclient.p12文件。
查看dltclient.p12内容:
keytool.exe -list -keystore dltclient.p12 -storepass ipcc@95598 -storetype pkcs12
可以看到如下输出:
可以看到其中包含了证书和私钥,并且其认证指纹是和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");
//man.saveCert(alias, "123456");
} catch (Exception e){
e.printStackTrace();
}
}
// 导出证书
private void exportCert(Pkcs12Manager man,String alias,HttpServletResponse response){
OutputStream out= null ;
try {
Certificate cert = man. keyStore .getCertificate(alias);
// 得到证书内容(以编码过的格式)
byte [] buf = cert.getEncoded();
// 写证书文件
response.setContentType( "application/x-download" );
response.addHeader( "Content-Disposition" , "attachment;filename="
+ man. file .getName());
out= response.getOutputStream();
out.write(buf);
}
catch (Exception e){e.printStackTrace();}
finally {
try {
out.close();
} catch (Exception e){
}
}
}
/**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request,response);
}
}
其中,Pkcs12Manager是一个javabean,提供了对PKCS12证书的读取、修改操作,代码如下:
public class Pkcs12Manager {
public File file ;
public KeyStore keyStore ;
private char [] storePass ;
public Pkcs12Manager(File file, String pass) throws IOException, Exception {
this . file = file;
this . storePass =pass.toCharArray();
getKeyStore(); // 加载 KeyStore 文件
}
// 加载 KeyStore 文件
public synchronized KeyStore getKeyStore() throws IOException, Exception {
if ( keyStore == null ) {
FileInputStream fin = new FileInputStream( file );
KeyStore store = KeyStore.getInstance ( "PKCS12" );
try {
store.load(fin, storePass );
}
finally {
try {
fin.close();
} catch (IOException e) { }
}
keyStore = store;
}
return keyStore ;
}
// 读取 alias 指定的证书内容
public X509CertInfo getX509CertInfo(String alias) throws Exception {
X509CertImpl cimp=getX509CertImpl(alias);
// 获取 X509CertInfo 对象
return (X509CertInfo) cimp.get(X509CertImpl. NAME
+ "." + X509CertImpl. INFO );
}
// 根据 alias 获取 X509CertImpl 对象
private X509CertImpl getX509CertImpl(String alias) throws Exception{
Certificate c = keyStore .getCertificate(alias); // 读取证书
// 从待签发的证书中提取证书信息
byte [] enc = c.getEncoded(); // 获取 证书内容(经过编码的字节)
X509CertImpl cimp= new X509CertImpl(enc); // 创建 X509CertImpl 象
return cimp;
}
// 修改证书过期时间 : 过期时间顺延 n 天
public void updateExpiration(String alias,String keypass, int n) throws Exception{
System. out .println(getExpiration(alias));
X509CertInfo cinfo=getX509CertInfo(alias); // 获取 X509CertInfo 对象
X509CertImpl cimp=getX509CertImpl(alias); // 获取 X509CertImpl 对象
String sigAlgrithm=cimp.getSigAlgName(); // 获取签名算法
CertificateValidity cv=(CertificateValidity)cinfo.get(X509CertInfo. VALIDITY );
// 有效期为当前日期后延 n 天
Date d2 = new Date( new Date().getTime() + n * 24 * 60 * 60 * 1000L);
System. out .println( "new date:" +d2.toString());
// 创建有效期对象
cv.set(CertificateValidity. NOT_AFTER , d2);
cinfo.set(X509CertInfo. VALIDITY , cv); // 设置有效期
saveCert(alias,keypass,cinfo,sigAlgrithm);
System. out .println(getExpiration(alias));
}
// 读取证书过期时间
public String getExpiration(String alias) throws Exception{
X509CertInfo cinfo=getX509CertInfo(alias);
CertificateValidity cv=(CertificateValidity)cinfo.get(X509CertInfo. VALIDITY );
// 创建有效期对象
Date d=(Date)cv.get(CertificateValidity. NOT_AFTER );
return d.toString();
}
// 存储证书
private void saveCert(String alias,String keypass,
X509CertInfo cinfo,String algrithm) throws Exception{
// 从密钥库中读取 CA 的私钥
PrivateKey pKey = (PrivateKey) keyStore .getKey(alias, keypass.toCharArray());
X509CertImpl cert = new X509CertImpl(cinfo); // 新建证书
cert.sign(pKey, algrithm); // 使用 CA 私钥对其签名
// 获取别名对应条目的证书链
Certificate[] chain = new Certificate[] { cert };
// 向密钥库中添加条目 , 使用已存在别名将覆盖已存在条目
keyStore .setKeyEntry(alias, pKey, keypass.toCharArray(), chain);
// 将 keystore 存储至文件
FileOutputStream fOut = new FileOutputStream( file );
keyStore .store(fOut, storePass );
fOut.close();
}
// 获取签名算法
public String getSigAlgName(String alias) throws Exception{
Certificate c = keyStore .getCertificate(alias); // 读取证书
// 获取 证书内容(经过编码的字节)
byte [] enc = c.getEncoded();
// 创建 X509CertImpl 对象
X509CertImpl cimp2 = new X509CertImpl(enc);
String sigAlgrithm=cimp2.getSigAlgName();
return sigAlgrithm;
}
}
将上述Servlet 和javabean 部署到服务器中。这样,通过访问http://localhost/GetP12Cert 就可以获得一个有效的证书dlt.cer。
二、 证书的验证
假设我们的客户端为iPhone客户端。则在iPhone中进行证书验证的代码为:
NSString * path=[[ NSBundle mainBundle ] pathForResource : @"dlt.cer" ofType : nil ];
// EfficientDate 参数为任意一个有效的日期(在证书有效期之内)
MyTrustService * myTrust=[[ MyTrustService alloc ]
initWithFilename :path EfficientDate : @"2011-05-10 0:0:0" ];
ValuateResult ret=[myTrust trustValuate :[[ NSDate alloc ] init ]];
switch (ret) {
case ValuateResultOK :
NSLog ( @" 证书有效 " );
break ;
case ValuateResultEXPIRED :
NSLog ( @" 证书已过期 " );
break ;
default :
NSLog ( @" 证书校验失败 " );
break ;
}
[myTrust release ];
其中MyTrustService代码为(注意导入security.framework框架):
#import <Foundation/Foundation.h>
#import <Security/Security.h>
static const char * kTrustNames [ 8 ] = {
"Invalid" ,
"Proceed" ,
"Confirm" ,
"Deny" ,
"Unspecified" ,
"RecoverableTrustFailure" ,
"FatalTrustFailure" ,
"OtherError"
};
typedef enum
{
ValuateResultINVALID = 0 , // 评估结果无效,表明评估出错或未经过评估
ValuateResultFAILED , // 证书签名无效
ValuateResultEXPIRED , // 证书过期
ValuateResultOK // 证书有效
} ValuateResult;
@interface MyTrustService : NSObject {
NSString * file ;
NSDate * efficientDate ;
}
-( id )initWithFilename:( NSString *)filename EfficientDate:( NSString *)date;
-( ValuateResult )trustValuate:( NSDate *)date;
-( ValuateResult )valuate:( SecCertificateRef )cert Trust:( SecTrustRef )trust Date:( NSDate *)date;
@end
#import "MyTrustService.h"
@implementation MyTrustService
-( id )initWithFilename:( NSString *)filename EfficientDate:( NSString *)date{
if ( self =[ super init ]) {
file =filename;
// 设置有效日期,注意,第 2 个参数是一个有效的证书日期,只要这个日期对证书而言是有效的就行
efficientDate =[[ NSDate alloc ] initWithString :date];
}
return self ;
}
-( ValuateResult )trustValuate:( NSDate *)date{
ValuateResult ret;
OSStatus err;
NSData * certData;
SecCertificateRef cert;
SecPolicyRef policy;
SecTrustRef trust;
assert ( file != nil );
assert (date != nil );
// 从文件获得 DER 数据
certData = [ NSData dataWithContentsOfFile : file ];
assert (certData != nil );
// 从 NSData 获得 Certificate 对象
cert = SecCertificateCreateWithData ( NULL , ( CFDataRef ) certData);
assert (cert != NULL );
// 获得 x509 policy
policy = SecPolicyCreateBasicX509 ();
assert (policy != NULL );
// 获得 Trust 对象
err = SecTrustCreateWithCertificates (cert, policy, &trust);
assert (err == noErr );
// 由于是自签名证书,需要将锚证书设置为要验证的证书自己。注意,这样将使所有除了参数指定的锚证书之外的所有锚证书无效
err = SecTrustSetAnchorCertificates (trust, ( CFArrayRef ) [ NSArray arrayWithObject :( id ) cert]);
assert (err == noErr );
// 调用 valuate 方法进行评估
ret=[ self valuate :cert Trust :trust Date :date];
// 评估结束,把 SecTrustSetAnchorCertificates 指定的锚证书失效,于是所有锚证书又可被信任了
err= SecTrustSetAnchorCertificatesOnly (trust, NO );
CFRelease (trust);
CFRelease (policy);
CFRelease (cert);
return ret;
}
-( ValuateResult )valuate:( SecCertificateRef )cert Trust:( SecTrustRef )trust Date:( NSDate *)date{
ValuateResult ret;
OSStatus err;
SecTrustResultType result;
err = SecTrustSetVerifyDate (trust, ( CFDateRef ) date);
assert (err == noErr );
CFAbsoluteTime trustTime;
trustTime = SecTrustGetVerifyTime (trust);
err = SecTrustEvaluate (trust, &result);
assert (err == noErr );
if (result < ( sizeof ( kTrustNames ) / sizeof (* kTrustNames ))) { // if(result < 8)
if (result== 5 ) { // if result=RecoverableTrustFailure
// 设了个有效的日期,进行再次评估
err= SecTrustSetVerifyDate (trust, ( CFDateRef ) efficientDate );
assert (err== noErr );
err= SecTrustEvaluate (trust, &result);
assert (err == noErr );
if (result== 4 ) { // if result=Unspecified,
// 返回证书已过期,这里我们假设把证书尚未生效的情况也算作过期
ret= ValuateResultEXPIRED ;
}
} else if (result== 4 ) { // 如果第 1 次就通过评估,证书有效
ret= ValuateResultOK ;
} else {
ret= ValuateResultFAILED ; // 证书 无效
}
} else {
NSLog ( @"result = unknown (%zu)" , ( size_t ) result);
}
return ret;
}
-( void )dealloc{
[ efficientDate release ];
[ super dealloc ];
}
@end
相关推荐
总结来说,创建PKCS#12格式的数字签名证书涉及密钥对生成、X.509证书创建、PKCS#12存储构建和文件输出等步骤。BouncyCastle库提供了一套完整的API,使得在Java中实现这一过程变得相对简单。了解并熟练掌握这些步骤和...
2. 私钥和证书管理:PKCS #12 支持私钥和证书的管理,包括私钥的生成、存储和传递,以及证书的签发和验证。 3. 秘密值管理:PKCS #12 定义了一种秘密值的管理机制,包括秘密值的生成、存储和传递。 4. 扩展机制:...
"C# SHA256 PKCS#7 生成验名、验签源码 中行支付.rar"这个压缩包文件提供了使用C#编程语言实现SHA256哈希算法和PKCS#7标准来创建和验证签名的源代码。以下将详细解释这两个关键概念及其在金融支付中的应用。 1. SHA...
6. 处理证书链:验证签名时还需要检查证书的有效性,包括证书是否过期,颁发者是否可信,以及证书链是否完整。 通过这个源代码,开发者不仅可以学习到如何使用Capicom进行数字签名和验证,还可以了解到如何在实际...
在PFX证书生成过程中,RSA算法用于生成密钥对,确保数据的安全传输。 生成PFX证书通常涉及以下步骤: 1. **生成密钥对**:使用工具(如OpenSSL或Windows的Certreq.exe)生成一对RSA密钥,即一个公钥和一个私钥。...
P12证书生成步骤 理论上来讲,只要拥有原始的RSA密钥对以及CA根据该密钥对生成的证书,即可通过特定的工具和流程将X.509 DER证书转换为P12格式。具体步骤包括: - **生成RSA密钥对**:使用如OpenSSL这样的工具...
总的来说,掌握PKCS#10和ASN.1对于理解数字证书的申请和管理至关重要,这对于网络服务器的安全配置、企业内部的身份验证以及各种在线服务的访问控制都有深远影响。无论是开发安全系统还是进行系统管理员工作,都需要...
在给定的"PKCS11导入证书.rar"压缩包中,我们主要关注的是如何使用PKCS11来处理证书。证书,通常指的是X.509证书,是公钥基础设施PKI中的重要组成部分,用于验证一个实体的身份。它包含了公钥、持有者信息、颁发者...
2. **证书格式**:常见的证书格式有PEM(Privacy Enhanced Mail)、DER(Distinguished Encoding Rules,二进制格式)和PKCS#12(Public Key Cryptography Standards #12)。每种格式都有其特定的应用场景和优势。 ...
1. 生成服务端证书:`keytool -genkey -v -alias serverkey -keyalg RSA -storetype PKCS12 -keystore kserver.key.p12` 这将生成一个服务端证书,用于 Java 应用程序。 2. 导出服务端公钥证书:`keytool -export -...
P12格式,也称为PKCS#12,是一种常用的存储私钥和公钥证书的标准格式,常用于个人身份验证、服务器证书等场景。 在“OpenSSL 解析P12格式证书文件”这一主题中,我们主要会探讨以下几个知识点: 1. **P12格式**:...
标题"pkcs#11测试源码"指的是针对PKCS#11接口的源代码测试项目,目的是验证和确保PKCS#11接口在不同环境和设备上的正确性和兼容性。测试源码通常包括各种测试用例,用于覆盖接口的所有功能,如生成密钥对、加密解密...
验签时,需要验证签名是否由拥有相应私钥的实体产生,这通常通过对比签名中嵌入的证书与已知的证书链进行。 在"pkcs7_php"这个项目中,可能包含了实现这些功能的PHP代码示例,可能包括签名函数、验签函数以及必要的...
证书生成工具,如标题所示,是用来创建这些证书的软件。这些工具通常包括一系列命令行工具或图形用户界面(GUI)应用,使得用户能够自定义证书参数,满足特定的安全需求。 在Windows操作系统中,证书的生成涉及多种...
可使用此格式,通过ASN1C生成完整的PKCS7签名C语言代码,实现诸如SM2算法数字签名及验证。 注意,CertificateSerialNumber本来在PKCS7标准ASN1结构中定义为INTEGER类型,但由于ASN1C将INTEGER类型翻译成long,不支持...
7. **处理证书链**:在实际应用中,接收方可能还需要验证发送方的证书链,确保证书是由信任的CA(证书颁发机构)签发的,并且没有过期。这可以通过BouncyCastle的`X509CertificateParser`和`X509Store`类来完成。 ...
openssl pkcs12 -in d:\tomcatclient.p12 -out d:\key.pem ``` 其中,“d:\tomcatclient.p12”是输入的`.p12`文件路径,“d:\key.pem”是输出的`.pem`文件路径。 #### 注意事项 - 执行此命令时可能需要输入`.p12...
总的来说,PKCS #10规范为公钥基础设施(PKI)中的证书申请提供了一套标准流程和数据格式,确保了公钥证书的发放和验证过程的安全与可靠。而随着网络应用的广泛扩展,PKI和PKCS #10在保障网络安全、身份验证和数据...
它支持多种类型的密钥库,如JKS(Java KeyStore)、BKS(Bouncy Castle KeyStore)、PKCS12等,同时也能够处理各种证书格式。在描述中提到的证书转换,主要包括P12到BKS以及BKS到P12的过程。 首先,我们来了解下...
PKCS11接口提供了一系列函数,这些函数允许应用程序执行诸如生成密钥对、存储和检索证书、签名和验证数据等任务。这些函数通常包括初始化、选择对象、执行加密和解密、签名和验证签名等操作。 USB KEY,也称为电子...