下面是OPENSSL生成密钥对示例:
一,使用RSA算法:
生成私钥:openssl genrsa -out privatekey.key 1024
对应公钥:openssl rsa -in privatekey.key -pubout -out pubkey.key
java -Xmx2048m -jar out/host/linux-x86/framework/signapk.jar -w build/target/product/security/testkey.x509.pem build/target/product/security/testkey.pk8 /tmp/tmpUKAnQq out/target/product/mstaramber3/full_mstaramber3-ota-eng.jc.zip
jarsigner -verify -certs -verbose a.apk
openssl x509 -in platform.x509.pem openssl pkcs7 -in CERT.RSA -inform DER -print_certs
keytool -printcert -v -file CERT.RSA
二,使用DSA算法:
生成DSA参数:openssl dsaparam -out dsa_param.pem 1024
生成私钥:openssl gendsa -out dsa_private_key.pem dsa_param.pem
对应公钥:openssl dsa -in dsa_private_key.pem -pubout -out dsa_public_key.pem
以使用openssl x509命令来查看公钥证书的详细信息:
$ openssl x509 -in media.x509.pem -text -noout
or,
$ openssl x509 -in media.x509.pem -inform PEM -text -noout
还可以使用JDK中的keytool来查看公钥证书内容,但其输出内容没有openssl x509全面:
$ keytool -printcert -v -file media.x509.pem
使用keytool和jarsigner命令
创建key,需要用到 keytool,使用产生的key对apk签名用到的是jarsigner。
keytool -genkey -alias demo.keystore -keyalg RSA -validity 40000 -keystore demo.keystore
/*说明:-genkey 产生密钥
-alias demo.keystore 别名 demo.keystore
-keyalg RSA 使用RSA算法对签名加密
-validity 40000 有效期限4000天
-keystore demo.keystore */
jarsigner -verbose -keystore demo.keystore -signedjar demo_signed.apk demo.apk demo.keystore
/*说明:-verbose 输出签名的详细信息
-keystore demo.keystore 密钥库位置
-signedjar demor_signed.apk demo.apk demo.keystore 正式签名,三个参数中依次为签名后产生的文件demo_signed,要签名的文件demo.apk和密钥库demo.keystore.*/
使用signapk 工具
java -jar signapk.jar platform.x509.pem platform.pk8 MyDemo.apk MyDemo_signed.apk
signapk的参数分别为公钥,私钥,需要签名的apk,签名后的apk
用这种方法签名的应用根据签名的不同可以获取系统的不同权限。
签名之后,可以用zipalign(压缩对齐)优化APK文件
zipalign -v 4 demo_signed.apk final.apk
‘/C=CN/ST=Beijing/L=Beijing/O=Letv/OU=Letv/CN=LetvApp’ 其中第一个为key的名字,一般都默认成android本身有的,因为很多地方都默认使用了这些名字,我们自定义的话只需要对第二个参数动手脚,定义如下:
C —> Country Name (2 letter code)
ST —> State or Province Name (full name)
L —> Locality Name (eg, city)
O —> Organization Name (eg, company)
OU —> Organizational Unit Name (eg, section)
CN —> Common Name (eg, your name or your server’s hostname)
emailAddress —> Contact email address 使用目标系统的platform密钥来重新给apk文件签名。这步比较麻烦,首先找到密钥文件,在我的Android源码目录中的位置是”buildtargetproductsecurity”,下面的platform.pk8和platform.x509.pem两个文件。然后用Android提供的Signapk工具来签名,signapk的源代码是在”buildtoolssignapk”下,用法为”signapk platform.x509.pem platform.pk8 input.apk output.apk”
openssl genrsa 用于生成rsa私钥文件,生成是可以指定私钥长度和密码保护。
语法
openssl genrsa[-out filename] [-passout arg] [-des] [-des3] [-idea] [-f4] [-3] [-rand file(s)] [-engine id] [numbits]
一般使用
- E:OpenSSLfoo>openssl genrsa -out rsa_pri.pme
- Loading ‘screen’ into random state – done
- Generating RSA private key, 512 bit long modulus
- .++++++++++++
- ……………++++++++++++
- e is 65537 (0x10001)
从输出可以看出,密钥长度是512bit。我们也可以指定密钥长度,密钥长度越长越安全,但使用密钥进行加解密时所耗费的时间也会变长。非对称密钥 提高安全性的同时也带来了算法所耗费的大量时间,非对称密钥不对大块数据进行加密,应用领域是数字签名,密钥分发等小数据加密。
numbits 密钥长度(单位bit)
- openssl genrsa -out rsa_pri.pem 1024
-passout arg
对生成的rsa私钥文件施加密码保护,例如:使用idea算法对私钥文件进行密码保护。
- openssl genrsa -idea -passout pass:123 -out rsa_pri.pem
-F4 / -3 指数(我不知道,算法里面的东西吧),默认是65537,例如上例中输出的最后一句话,e is 65537 (0x10001)
- E:OpenSSLfoo>openssl genrsa -3 -out rsa_pri.pem 2000
- Loading ‘screen’ into random state – done
- Generating RSA private key, 2000 bit long modulus
- ………………….+++
- ………….+++
- e is 3 (0x3)
openssl req 用于生成证书请求,以让第三方权威机构CA来签发,生成我们需要的证书。req 命令也可以调用x509命令,以进行格式转换及显示证书文件中的text,modulus等信息。如果你还没有密钥对,req命令可以一统帮你生成密钥对 和证书请求,也可以指定是否对私钥文件进行加密。
语法
openssl req[-inform PEM|DER] [-outform PEM|DER] [-in filename] [-passin arg] [-out filename] [-passout arg] [-text] [-pubkey] [-noout] [-verify] [-modulus] [-new] [-rand file(s)] [-newkey rsa:bits] [-newkey alg:file] [-nodes] [-key filename] [-keyform PEM|DER] [-keyout filename] [-keygen_engine id] [-[digest]] [-config filename] [-subj arg] [-multivalue-rdn] [-x509] [-days n] [-set_serial n] [-asn1-kludge] [-no-asn1-kludge] [-newhdr] [-extensions section] [-reqexts section] [-utf8] [-nameopt] [-reqopt] [-subject] [-subj arg] [-batch] [-verbose] [-engine id]
-new
这个选项用于生成一个新的证书请求,并提示用户输入个人信息。如果没有指定-key 则会先生成一个私钥文件,再生成证书请求。
- E:OpenSSLfoo>openssl req -new -key rsa_pri_nopw.pem -out crs.pem
- Loading ‘screen’ into random state – done
- You are about to be asked to enter information that will be incorporated
- into your certificate request.
- What you are about to enter is what is called a Distinguished Name or a DN.
- There are quite a few fields but you can leave some blank
- For some fields there will be a default value,
- If you enter ‘.’, the field will be left blank.
- —–
- Country Name (2 letter code) [AU]:CN
- State or Province Name (full name) [Some-State]:HeBei
- Locality Name (eg, city) []:SJZ
- Organization Name (eg, company) [Internet Widgits Pty Ltd]:CCIT
- Organizational Unit Name (eg, section) []:CCIT
- Common Name (eg, YOUR name) []:fym
- Email Address []:fym0121@163.com
- Please enter the following ‘extra’ attributes
- to be sent with your certificate request
- A challenge password []:
- An optional company name []:
- E:OpenSSLfoo>ls
- crs.pem
- rsa_pri_nopw.pem
没有指定-key选项时,会生成私钥文件,默认是有密码保护的,-nodes(no des),可以明确指定不需要密码保护。-keyout可以指定生成的私钥文件名,-pubout可以指定生成的公钥文件名
openssl req -new -out crs.pem
- openssl req -new -out crs.pem -nodes
-subj 替换或指定证书申请者的个人信息
格式是:/type0=value0/type1=value1/type2=…(其中C是Country,ST是state,L是local,O是Organization,OU是Organization Unit,CN是common name)
- E:OpenSSLfoo>openssl req -new -key rsa_pri_nopw.pem -out crs.pem -subj /C=CN/S
- T=HB/L=SJZ/O=CCIT/OU=CCIT/CN=fym/emailAddress=fym0121@163.com
- Loading ‘screen’ into random state – done
-newkey arg 生成私钥和证书请求,类似与-new
arg的格式是rsa:nbit ,还有几个格式,我只能看懂这个
openssl req -newkey rsa:1024 -out crs.pem
-xf09 生成自签名证书
- openssl req -newkey rsa:1024 -x509 -nodes -out selfsing.pem
-config 指定配置文件,参见 config
产生自签名的root CA
1、建立目录结构(参加ca directory structure)
假设当前工作目录为E:OpenSSLfoo,在此目录下建立以下目录结构
- E:OpenSSLfoo>mkdir demoCA
- E:OpenSSLfoo>mkdir demoCAprivate demoCAnewcerts
在demoCA目录下建立两个空文件,serial和index.txt,并向serial文件中写入”01″两个字符
2、产生自签名证书,作为root ca使用
- E:OpenSSLfoo>openssl req -new -x509 -keyout cakey.pem -out cacert.pem
提示输入密码保护私钥,和自签名root ca的信息。生成两个文件,将cakey.pem放到demoCAprivate目录下,将cacert.pem放到demoCA目录下。
E:OpenSSLfoo>move cacert.pem demoCA
- E:OpenSSLfoo>move cakey.pem demoCAprivate
至此,root ca已经建立完毕。
证书请求及签名
1、生成请求
- E:OpenSSLfoo>openssl req -new -nodes -out req.pem
提示输入个人信息,最后生成req.pem证书请求文件。
2、签名,生成证书
- E:OpenSSLfoo>openssl ca -in req.pem -out newcert.pem
- Using configuration from e:OpenSSLbinopenssl.cfg
- Loading ‘screen’ into random state – done
- Enter pass phrase for ./demoCA/private/cakey.pem:
- Check that the request matches the signature
- Signature ok
sed -i s/”com.letv.letvappupdate”/”com.cibn.cibnappupdate”/g ` grep -rl –exclude-dir=.git “com.letv.letvappupdate” .`
‘/make_key test ‘/C=CN/ST=SH/L=SH/O=TEST/OU=TEST/CN=TEST’
pkcs8格式的私钥转换工具。它处理在PKCS#8格式中的私钥文件。它可以用多样的PKCS#5 (v1.5 and v2.0)和 PKCS#12算法来处理没有解密的PKCS#8 PrivateKeyInfo格式和EncryptedPrivateKeyInfo格式。
用法:
[cpp] view plain copy
- openssl pkcs8 [-inform PEM|DER] [-outform PEM|DER] [-in filename] [-passin arg] [-out filename]
- [-passout arg] [-topk8] [-noiter] [-nocrypt] [-nooct] [-embed] [-nsdb] [-v2 alg] [-v1 alg] [-engine id]
选项说明:
-inform PEM|DER::输入文件格式,DER或者PEM格式。DER格式采用ASN1的DER标准格式。一般用的多的都是PEM格式,就是base64编码格式。
-outform DER|PEM:输出文件格式,DER或者PEM格式。
-in filename:输入的密钥文件,默认为标准输入。如果密钥被加密,会提示输入一个密钥口令。
-out filename:输出文件,默认为标准输出。如果任何加密操作已经执行,会提示输入一个密钥值。输出的文件名字不能和输入的文件名一样。
-topk8:通常的是输入一个pkcs8文件和传统的格式私钥文件将会被写出。设置了此选项后,位置转换过来:输入一个传统格式的私钥文件,输出一个PKCS#8格式的文件。
-noiter:MAC保护计算次数为1。
-nocrypt:PKCS#8密钥产生或输入一般用一个适当地密钥来加密PKCS#8 EncryptedPrivateKeyInfo结构。设置了此选项后,一个不加密的PrivateKeyInfo结构将会被输出。这个选项一直不加密私钥文件,在绝对必要的时候才能够使用。某些软件例如一些JAVA代码签名软件使用不加密的私钥文件。
-nooct:这个选项产生的RSA私钥文件是一个坏的格式,一些软件将会使用。特别的是,私钥文件必须附上一个八位组字符串,但是一些软件仅仅包含本身的结构体没有使八位组字符串所环绕。不采用八位组表示私钥。
-embed:这个选项产生的RSA私钥文件是一个坏的格式。在私钥结构体中采用嵌入式DSA参数格式。在这个表单中,八位组字符串包含了ASN1 SEQUENCE中的两种结构:一个SEQUENCE包含了密钥参数,一个ASN1 INTEGER包含私钥值。
-nsdb:这个选项产生的RSA私钥文件是一个坏的格式并兼容了Netscape私钥文件数据库。采用NetscapeDB的DSA格式。
-v2 alg:采用PKCS#5 v2.0,并指定加密算法,默认的是PKCS#8私钥文件被叫做B
-v1 alg:采用PKCS#5 v1.5或pkcs12,并指定加密算法。可采用的算法见下面。
-engine id:指定硬件引擎。
注意:
加密了的PEM编码PKCS#8文件表单用下面的头部和尾部:
—–BEGIN ENCRYPTED PRIVATE KEY—–
—–END ENCRYPTED PRIVATE KEY—–
未加密的表单用:
—–BEGIN PRIVATE KEY—–
—–END PRIVATE KEY—–
跟传统的SSLeay算法相比,用PKCS#5 v2.0系列的算法加密私钥,有更高的安全性以及迭代次数。于是附加的安全性是经过深思熟虑的。
默认的加密算法仅仅是56字节的,是因为它是PKCS#8所支持的最好的方法。
有一些软件使用PKCS#12基于密钥的加密算法来加密PKCS#8格式的私钥:它们会自动的处理但是没有选项来操作。
在PKCS#8格式中,有可能的是输出DER编码格式的经过加密的私钥文件,是因为加密的详细说明包含在DER等级中,相反的是传统的格式包含在PEM邓丽中。
PKCS#5 v1.5和 PKCS#12算法:
各种各样的算法可以被选项-v1所使用。包含PKCS#5 v1.5和 PKCS#12 算法。详细描述如下:
B
B
B
实例:
用3des算法将传统的私钥文件转换为PKCS#5 v2.0:
[cpp] view plain copy
- openssl pkcs8 -in key.pem -topk8 -v2 des3 -out enckey.pem
用PKCS#5 1.5兼容的DES算法将私钥文件转换为pkcs8文件:
[html] view plain copy
- openssl pkcs8 -in ocspserverkey.pem -topk8 -out ocspkcs8key.pem
用PKCS#12兼容的3DES算法将私钥文件转换为pkcs8文件:
[html] view plain copy
- openssl pkcs8 -in key.pem -topk8 -out enckey.pem -v1 PBE-SHA1-3DES
读取一个DER格式加密了的PKCS#8格式的私钥:
[cpp] view plain copy
- openssl pkcs8 -inform DER -nocrypt -in key.der -out key.pem
转换一个PKCS#8格式的私钥到传统的私钥:
[cpp] view plain copy
- openssl pkcs8 -in pk8.pem -out key.pem
pkcs8中的私钥以明文存放:
[html] view plain copy
- openssl pkcs8 -in ocspserverkey.pem -topk8 -nocrypt -out ocspkcs8key.pem
标准:
PKCS#5 v2.0的测试向量的实现是以通告的形式用高强度的迭代次数算法3DES、DES和RC2来加密的。很多人要确认能够解密产生的私钥。
PKCS#8格式的DSA私钥文件没有备注文件中的:在PKCS#11 v2.01中的11.9节被隐藏了的。OpenSSL的默认DSA PKCS#8私钥格式隐藏在这个标准中。
BUGs:
必须有一个选项打印使用的加密算法的其他详细细节,例如迭代次数。
PKCS#8用3DES和PKCS#5 v2.0必须是默认的私钥文件:目前为了命令的兼容性。
用keytool生成证书
配置环境变量JAVA_HOME,并将%JAVA_HOME%/bin配置到环境变量path中,我使用的jdk版本是1.5.0,执行:
keytool -genkey -alias tomcat -keyalg RSA -keystore e:/tomcat/https/mykey -storepass 111111 -keypass 111111
回车,会提示你输入一些个人信息及组织信息如:
What is your first and last namebr> What is the name of your organizational unitbr> What is the name of your organizationbr> What is the name of your City or Localitybr> What is the name of your State or Provincebr> What is the two-letter country code for this unitbr> Is
公共名称(cn)应该是服务器的域名。
JDK中keytool常用命令
-genkey 在用户主目录中创建一个默认文件”.keystore”,还会产生一个mykey的别名,mykey中包含用户的公钥、私钥和证书
-alias 产生别名
-keystore 指定密钥库的名称(产生的各类信息将不在.keystore文件中
-keyalg 指定密钥的算法
-validity 指定创建的证书有效期多少天
-keysize 指定密钥长度
-storepass 指定密钥库的密码
-keypass 指定别名条目的密码
-dname 指定证书拥有者信息 例如: “CN=sagely,OU=atr,O=szu,L=sz,ST=gd,C=cn”
-list 显示密钥库中的证书信息 keytool -list -v -keystore sage -storepass ….
-v 显示密钥库中的证书详细信息
-export 将别名指定的证书导出到文件 keytool -export -alias caroot -file caroot.crt
-file 参数指定导出到文件的文件名
-delete 删除密钥库中某条目 keytool -delete -alias sage -keystore sage
-keypasswd 修改密钥库中指定条目口令 keytool -keypasswd -alias sage -keypass …. -new …. -storepass … -keystore sage
-import 将已签名数字证书导入密钥库 keytool -import -alias sage -keystore sagely -file sagely.crt
导入已签名数字证书用keytool -list -v 以后可以明显发现多了认证链长度,并且把整个CA链全部打印出来。
2、在tomcat中使用证书,修改server.xml,加入下面一段话:
clientAuth=”false” sslProtocol=”TLS” keystoreFile=”e:/tomcat/https/mykey” keystorePass=”111111″ URIEncoding=”GBK”/>
3、重启Tomcat后在地址栏输入:https://localhost:1443
浏览显示的时候提示安装证书。
测试成功
4、导出证书
keytool -export -alias tomcat -storepass 111111 –
file e:/tomcat/https/server.cer -keystore e:/tomcat/https/mykey
扫描二维码,一起学习交流。

声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!