使用Openssl是为了生成公钥和私钥对,用于外部商户系统和xxx系统之间报文的安全性验证。如果使用者不需要生成公私钥,而是直接对报文进行处理,则参考第四部分,计算摘要及签名值。
1. 安装openssl步骤直接点击exe文件。出现需要安装vs2008插件的,直接忽略。
2. 在安装过程中找到OpenSSL相应的安装目录,进入bin目录下找到openssl.exe可执行文件,点击运行。然后分别按顺序输入如下命令:
a. genrsa –out private-rsa.key 1024
说明:该命令是生成一个没有加密的私钥
genrsa 生成私钥文件,私钥存储在private-rsa.key中,长度为1024。out后面指定输出文件名。
private-rsa.key 为生成的私钥文件,但该文件必须经过处理得到私钥。
b. req –new –x509 –key private-rsa.key –days 750 –outpublic-rsa.cer
说明:根据private-rsa.key生成证书public-rsa.cer
-new 表示新的请求
-509 表示输出的证书结构
750表示证书有效天数
-out public-rsa.cer -out后面表示公钥证书,用于验证数字签名,此公钥证书或者公钥需要提前发送给需要验证本单位或部门数据的接收方。
c. pkcs12 –export –name test-alias –in public-rsa.cer–inkey private-rsa.key –out 99bill-rsa.pfx
说明:生成PKCS12 格式Keystore
密码前后输入要一致,这个密码在用Keystore生成公私钥过程中会用到。
Public-rsa.cer, private-rsa.key是之前生成的。
附1:
下述代码是从99bill-rsa.pfx中获取私钥的Java版本代码。因为private-rsa.key中生成的私钥无法直接使用,必须进行一定的处理。
代码有几个注意点:
文件流初始化路径需要根据自己的实际路径来填写。
密码是在第二节中c步骤中的密码,本实例输入的是suning。
KeyStorekeyStore = KeyStore.getInstance("PKCS12")
FileInputStreamfileInputStream = newFileInputStream("D:/OpenSSL/bin/99bill-rsa.pfx")
char[]nPassword = "suning".toCharArray()
StringkeyAlias = null
keyStore.load(fileInputStream,nPassword)
fileInputStream.close()
System.out.println("keystoretype=" + keyStore.getType())
Enumeration<String>enumeration = keyStore.aliases()
if(enumeration.hasMoreElements())
{
keyAlias = (String) enumeration.nextElement()
System.out.println("alias=[" + keyAlias +"]")
}
System.out.println("iskey entry=" + keyStore.isKeyEntry(keyAlias))
PrivateKeyprikey = (PrivateKey) keyStore.getKey(keyAlias, nPassword)
//私钥转成字符串
StringprivateStr = Base64.encodeBase64String(prikey.getEncoded()).trim()
//生成公钥字符串,还可以通过cer证书生成
Certificatecert = keyStore.getCertificate(keyAlias)
PublicKeypubkey = cert.getPublicKey()
StringpublicStr = Base64.encodeBase64String(pubKey.getEncoded()).trim()
注意:
1. 所用类的说明:
Base64:
import org.apache.commons.net.util.Base64
Certificate:
import java.security.cert.Certificate
2. 在openssl生成公私钥过程中,用户输入了密码。本例中密码为suning。
1. 摘要及生成方法
摘要的生成过程(digest方法全部实现了下述3个过程):
1. 根据key对传来的map数据排序;
2. 生成a1=b1&a2=b2&a3=b3形式的字符串,排除某些字符串Key值;
3. 调用digest方法进行md5编码;
以上三步均通过Digest.digest()方法实现:
String digest = Digest.digest(Map<String,String>map, String... keys)
传递的http报文体body内容如a1=b1&a2=b2&a3=b3形式的字符串,提取出需要加签的字符串并转成map形式。execludeKes是要排除的字段,是一个字符串数组。
计算摘要这一步很关键,因为选取的字段要求发送方和接收方必须一致,即发送方对哪些字段计算摘要,那么同样地接收方也必须对相同的字段计算摘要,否则会报6601的错误。
说明:a. Map是存储了计算摘要的字段
b. keys表示排除的字段,不能用于计算摘要的字段,如signature,signAlgorithm
2. 公钥证书及字符串转换方法
转换的目的:便于存储。(商户直接提供公钥证书也可以,但是对于向验签系统提供公钥字符串的商户,需要用下述代码把公钥转成字符串)
1. 公钥/私钥字符串转成公钥/私钥,主要是把字符串转成公钥PublicKey
X509EncodedKeySpec pubKeySpec = newX509EncodedKeySpec(Base64.decodeBase64(strPubKey))
KeyFactorykeyFactory = KeyFactory.getInstance(RSA)
PublicKeypubKey = keyFactory.generatePublic(pubKeySpec)
2. 公钥或私钥转成Base64字符串:
StringpublicStr = Base64.encodeBase64String(pubKey.getEncoded()).trim()
3. 公私钥验证方法
验证目的:公私钥生成之后,需要验证是否匹配。(之前许多商户生成公私钥混乱,无法确定公私钥是否匹配就添加到验签系统中)。此代码由用户自己用junit验证运行。验证公私钥生成是否正确,如果result为true,则说明公私钥生成正确;否则生成的公私钥有问题,不能使用。
String prik1 =""
String pubb =""
String data ="wkk"
String digest =Digest.digest(data)
PrivateKey privateKey =RSAUtil.getPrivateKey(prik1)
String sign =RSAUtil.sign(digest, privateKey)
boolean result =RSAUtil.vertiy(digest, sign,
RSAUtil.getPublicKey(pubb))
System.out.println(result)
服务器认证客户端:服务器端通过根CA给客户端颁发客户端证书,在制作客户端证书时加上和机器相关的信息就可以保证在特定的时候某个帐号只能在这台机器上和服务器交换报文,比如我们用支付宝时必须下载安装数字证书时,可以命名这本证书叫"某某的笔记本"或者是"公司电脑"之类的,就是支付宝给用户颁发证书,只能在这台机器上用,你换了机器就必须重新申请。建立SSL连接时,先是服务器将自己的服务器证书发给客户端,验证通过后,客户端就把自己的客户端证书发给服务器进行验证,如果通过,再进行后面的处理。客户端安装服务器根证书ca.crt到客户端信任证书库中,服务器端安装服务器根证书ca.crt到服务器信任证书库中。SSL握手时,服务器先将服务器证书server.p12发给客户端,客户端会到客户端信任证书库中进行验证,因为server.p12是根证书CA颁发的,所以验证通过;然后客户端将客户端证书client.p12发给服务器,同理因为client.p12是根证书CA颁发的,所以验证通过。1、数字证书的定义:
CA数字证书是由CA授权签名证书颁发的证书。 数字证书是在线世界中的身份z。 在网络世界中,您可以为彼此不认识的用户建立安全可靠的信任关系。 这种信任关系的建立源自PKI / CA认证中心。
2、数字证书的办理:
要获得证书,应该首先向CA申请。 CA确定了申请人的身份后,将分配一个公钥,然后CA将公钥绑定到申请人的身份信息,对其进行签名并为申请人形成证书。 为了验证证书的真实性,使用CA的公钥来验证该证书上的签名。 验证通过后,证书即被视为有效。
扩展资料:
一、CA证书的内容包括:
1、电子签证授权机构的信息,公共密钥用户信息,公共密钥,授权机构的签名和有效期等。证书的格式和验证方法通常遵循X.509国际标准。
2、加密:CA认证。 将文本转换为无法直接读取的形式(即密文)的过程称为加密。
3、解密:将密文转换为可以直接读取的文本(即纯文本)的过程称为解密。
二、CA证书在数字签名中对这些HASH函数的特殊要求是:
1、接收到的输入报文数据的长度没有限制。
2、为任何输入报文数据生成固定长度的摘要(数字指纹)输出。
3、可以根据报文轻松地计算出摘要。
4、难以对指定的摘要生成一个报文,而由该报文可以算出该指定的摘要。
5、难以生成两个不同的报文具有相同的摘要。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)