签名工具的使用

下面是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源码目录中的位置是"build\target\product\security",下面的platform.pk8和platform.x509.pem两个文件。然后用Android提供的Signapk工具来签名,signapk的源代码是在"build\tools\signapk"下,用法为"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]

一般使用

  1. E:\OpenSSL\foo>openssl genrsa -out rsa_pri.pme  
  2. Loading 'screen' into random state - done  
  3. Generating RSA private key, 512 bit long modulus  
  4. .++++++++++++  
  5. ...............++++++++++++  
  6. e is 65537 (0x10001)  

从输出可以看出,密钥长度是512bit。我们也可以指定密钥长度,密钥长度越长越安全,但使用密钥进行加解密时所耗费的时间也会变长。非对称密钥 提高安全性的同时也带来了算法所耗费的大量时间,非对称密钥不对大块数据进行加密,应用领域是数字签名,密钥分发等小数据加密。

numbits   密钥长度(单位bit)

  1. openssl genrsa -out rsa_pri.pem 1024  

-passout arg
对生成的rsa私钥文件施加密码保护,例如:使用idea算法对私钥文件进行密码保护。

  1. openssl genrsa  -idea -passout pass:123 -out rsa_pri.pem  

-F4 / -3    指数(我不知道,算法里面的东西吧),默认是65537,例如上例中输出的最后一句话,e is 65537 (0x10001)

  1. E:\OpenSSL\foo>openssl genrsa  -3  -out rsa_pri.pem 2000  
  2. Loading 'screen' into random state - done  
  3. Generating RSA private key, 2000 bit long modulus  
  4. ......................+++  
  5. .............+++  
  6. 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 则会先生成一个私钥文件,再生成证书请求。


  1. E:\OpenSSL\foo>openssl req -new -key rsa_pri_nopw.pem -out crs.pem  
  2. Loading 'screen' into random state - done  
  3. You are about to be asked to enter information that will be incorporated  
  4. into your certificate request.  
  5. What you are about to enter is what is called a Distinguished Name or a DN.  
  6. There are quite a few fields but you can leave some blank  
  7. For some fields there will be a default value,  
  8. If you enter '.', the field will be left blank.  
  9. -----  
  10. Country Name (2 letter code) [AU]:CN  
  11. State or Province Name (full name) [Some-State]:HeBei  
  12. Locality Name (eg, city) []:SJZ  
  13. Organization Name (eg, company) [Internet Widgits Pty Ltd]:CCIT  
  14. Organizational Unit Name (eg, section) []:CCIT  
  15. Common Name (eg, YOUR name) []:fym  
  16. Email Address []:fym0121@163.com  
  17.   
  18. Please enter the following 'extra' attributes  
  19. to be sent with your certificate request  
  20. A challenge password []:  
  21. An optional company name []:  
  22. E:\OpenSSL\foo>ls  
  23. crs.pem  
  24. rsa_pri_nopw.pem  


没有指定-key选项时,会生成私钥文件,默认是有密码保护的,-nodes(no des),可以明确指定不需要密码保护。-keyout可以指定生成的私钥文件名,-pubout可以指定生成的公钥文件名

openssl req -new -out crs.pem  

  1. 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)

  1. E:\OpenSSL\foo>openssl req -new -key rsa_pri_nopw.pem -out crs.pem -subj /C=CN/S  
  2. T=HB/L=SJZ/O=CCIT/OU=CCIT/CN=fym/emailAddress=fym0121@163.com  
  3. Loading 'screen' into random state - done  
-newkey arg     生成私钥和证书请求,类似与-new

arg的格式是rsa:nbit  ,还有几个格式,我只能看懂这个

openssl req -newkey rsa:1024 -out crs.pem  

-xf09 生成自签名证书
  1. openssl req -newkey rsa:1024 -x509 -nodes -out selfsing.pem  
-config 指定配置文件,参见 config

产生自签名的root CA

1、建立目录结构(参加ca directory structure)

假设当前工作目录为E:\OpenSSL\foo,在此目录下建立以下目录结构

  1. E:\OpenSSL\foo>mkdir demoCA  
  2. E:\OpenSSL\foo>mkdir demoCA\private demoCA\newcerts  
在demoCA目录下建立两个空文件,serial和index.txt,并向serial文件中写入"01"两个字符

2、产生自签名证书,作为root ca使用

  1. E:\OpenSSL\foo>openssl req -new -x509 -keyout cakey.pem -out cacert.pem  
提示输入密码保护私钥,和自签名root ca的信息。生成两个文件,将cakey.pem放到demoCA\private目录下,将cacert.pem放到demoCA目录下。

E:\OpenSSL\foo>move cacert.pem demoCA  

  1. E:\OpenSSL\foo>move cakey.pem demoCA\private  
至此,root ca已经建立完毕。

证书请求及签名

1、生成请求

  1. E:\OpenSSL\foo>openssl req -new -nodes -out req.pem  
提示输入个人信息,最后生成req.pem证书请求文件。

2、签名,生成证书

  1. E:\OpenSSL\foo>openssl ca -in req.pem -out newcert.pem  
  2. Using configuration from e:\OpenSSL\bin\openssl.cfg  
  3. Loading 'screen' into random state - done  
  4. Enter pass phrase for ./demoCA/private/cakey.pem:  
  5. Check that the request matches the signature  
  6. 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格式。

用法:

  1. openssl pkcs8 [-inform PEM|DER] [-outform PEM|DER] [-in filename] [-passin arg] [-out filename]   
  2. [-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:输入的密钥文件,默认为标准输入。如果密钥被加密,会提示输入一个密钥口令。

-passin arg:输入文件口令保护来源。

-out filename:输出文件,默认为标准输出。如果任何加密操作已经执行,会提示输入一个密钥值。输出的文件名字不能和输入的文件名一样。

-passout arg:输出文件口令保护来源。

-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<pbeWithMD5AndDES-CBC>(该算法用56字节的DES加密但是在PKCS#5 v1.5中有更加强壮的加密算法)的加密算法用口令进行加密。用B<-v2>选项,PKCS#5 v2.0相关的算法将会被使用,可以是des3(168字节)和rc2(128字节),推荐des3。

-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<PBE-MD2-DES PBE-MD5-DES>:这两个算法包含在PKCS#5 v1.5中。它们仅仅提供56字节的保护,加密算法用DES。

B<PBE-SHA1-RC2-64 PBE-MD2-RC2-64 PBE-MD5-RC2-64 PBE-SHA1-DES>:它们在传统的PKCS#5 v1.5中没有被提到,但是它们用同样地密钥引出算法,被一些软件所支持。在PKCS#5 v2.0中所提到。它们使用64字节的RC2以及56字节的DES。

B<PBE-SHA1-RC4-128 PBE-SHA1-RC4-40 PBE-SHA1-3DES PBE-SHA1-2DES PBE-SHA1-RC2-128 PBE-SHA1-RC2-40>:它们是PKCS#12基于密钥的加密算法,它们允许使用高强度的加密算法,例如3des或128位的RC2。

实例:

用3des算法将传统的私钥文件转换为PKCS#5 v2.0:

  1. openssl pkcs8 -in key.pem -topk8 -v2 des3 -out enckey.pem  


用PKCS#5 1.5兼容的DES算法将私钥文件转换为pkcs8文件:

  1. openssl pkcs8 -in ocspserverkey.pem -topk8 -out ocspkcs8key.pem  


用PKCS#12兼容的3DES算法将私钥文件转换为pkcs8文件:

  1. openssl pkcs8 -in key.pem -topk8 -out enckey.pem -v1 PBE-SHA1-3DES  


读取一个DER格式加密了的PKCS#8格式的私钥:

  1. openssl pkcs8 -inform DER -nocrypt -in key.der -out key.pem  


转换一个PKCS#8格式的私钥到传统的私钥:

  1. openssl pkcs8 -in pk8.pem -out key.pem  


pkcs8中的私钥以明文存放:

  1. 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 name?
  What is the name of your organizational unit?
  What is the name of your organization?
  What is the name of your City or Locality?
  What is the name of your State or Province?
  What is the two-letter country code for this unit?
  Is <CN=***, OU=***, O=***, L=***, ST=***, C=CN> correct?
  这里输入yes,回车即可。
  公共名称(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,加入下面一段话:
<Connector port="1443" protocol="HTTP/1.1"  connectionTimeout="20000"  SSLEnabled="true"
               maxThreads="150" scheme="https" secure="true"
               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


扫描二维码,一起学习交流。


转载于:https://my.oschina.net/jiangch/blog/669462

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值