x.500
作用:
是ITU-T关于目录服务的一系列规范、协议,用于解决国际电话、电报互联互通、邮件发送时的人员查找、身份认证等问题。
其它:
- 包括的子集: X.501 X.509
- 协议簇(1988年发布):
- DAP 轻量级实现:LDAP
- DSP
- DISP
- DOP
ASN.1(Abstract Syntax Notation One,抽象语法标识)
作用:
是一台平台无关、语言无关的数据结构定义语法。
编码格式(都可以编成XML格式):
- BER 常用
- CER 常用
- DER 常用
- XER
- TLV :二进制流的TLV方式表达数据结构
BER
Basic Encoding Rules 基本编码格式
DER
Distinguished Encoding Rules 卓越编码格式
- 是BER的一个子集,为更严格的一个变种版本
- 定长
CER
Canonical Encoding Rules 权威编码格式
- CER和DER一样,都是BER的限定编码规则的子集。
- CER和DER不同在于它是不定长编码,可以用于大数据块的封装。
导出证书格式
- DER 编码二进制 X.509(.CER)
- Base64 编码 X.509(.CER)
- 加密消息语法标准 - PKCS #7(.P7b)
- 个人信息交换 -PKCS #12(.PFX)
- Microsoft 序列化证书存储(.SST)
注 前三个导出的证书都是DER编码
第一种是二进制格式
第二种是PEM(安全电子邮件)格式的的文本格式
第三种是包括证书链的二进制格式,也可以是文本格式。
这里的CER仅是指文件后缀名,与ASN.1的CER编码没关系
PEM
- Privacy Enhanced Mail 安全增强邮件
- 这是一种文件格式,这格式使用一个头,尾标识文件的内容,如下:
被加密的私钥
---BEGIN ENCRYPTED PRIVATE KEY ---
LDKSFJSADJLSDKJGKLDFJFLSDKJFKLSDJSKLJFDGHKLSD
DJFLASKDFJLSKDFJKLSDJLDGHDJCVNDKFJGHDLFJSKLDF
DGJFKLCJVIHJURFJDGKLJFGDIJFGIOWEJIOLDJEOGEORI
---BND ENCRYPTED PRIVATE KEY ---
证书格式
---BEGIN CERTIFICATE---
LDKSFJSADJLSDKJGKLDFJFLSDKJFKLSDJSKLJFDGHKLSD
DJFLASKDFJLSKDFJKLSDJLDGHDJCVNDKFJGHDLFJSKLDF
DGJFKLCJVIHJURFJDGKLJFGDIJFGIOWEJIOLDJEOGEORI
---END CERTIFICATE---
他们之间的关系
- 所有X.509都是DER编码,DER是指ASN.1的编码规则,.der证书文件一般是二进制文件。
- CER可用于PKCS#7证书(p7b)的编码,但一般是指证书的文件后缀,.cer证书可以是纯BASE64文件或二进制文件。
- PEM通常也是指文件的后缀,为内容使用BASE64编码且带头带尾的特定格式,二进制的文件不应该命名为pem。
- CRT是微软的证书后缀名,和.CER是一回事。
- 微软的CryptAPI很强大,证书的各种格式都可以识别,比如纯BASE64编码的、标准PEM格式的、非标识PEM格式的(不是64字节换行、没有头尾等)、二进制格式的。
- 但openssl、JCE则不行,必须是标准的PEM格式和DER格式。
一些术语
PFX
Personal Information Exchange
- PKCS#12是PFX的后续版本,一般情况二者为等同概念
- PFX或PKCS#12 是包括私钥的个人证书,通过口令保护私钥
- 后缀名为.pfx 或 .p12
- openssl keytool portecle(keyStore工具)都可以生成PFX证书
CRL/ARL
Certificate Revocation List(证书吊销列表)
- 也属于X.509标准,定义在RFC5280
LDAP
Lightweight Directory Access Protocol(轻量目录访问协议)
- 是X.500 DAP协议的一个轻量级实现。
- 基本上遵循X.500的大部分标准,所以LDAP的DN结构、object class、attributes都是X.500标准。
一些操作(java)
KeyStore 类
- 主要来读取密钥
- 分两种情况 1 知道key的名字 2 不知道key的名字
- 第一种,先用fileinputstream 得到key名,再取key值
- 第二种,直接 keystore.getkey("name",passsword) passwrod是keystore的密码
certificate 类
- 主要用来得到公钥
- certificate.getpublickey
检验签名
//用公钥验签
//第一个data 是原文
//第二个data 是加密之后
public static boolean verify(byte[] data, PublicKey publicKey, byte[] sign) throws Exception {
Signature signature = Signature.getInstance(SIGNATURE_ALGORITHM);
//验签的过程
signature.initVerify(publicKey);
//进行操作与比对
signature.update(data);
//看看值是否一样
return signature.verify(sign);
}