数字签名相关
一些人說android只支持BKS證書。不知道真還是假,所以首先創(chuàng)建了BKS證書。
步驟:
1、下載bcprov-jdk16-141.jar,放到\jre\lib\ext目錄下
2、修改文件 ?jre6\lib\security\java.security, 在文件中添加: ?security.provider.10=org.bouncycastle.jce.provider.BouncyCastleProvider
? ?在這個文件中找到security.provider字樣,后面序號遞增,本機(jī)遞增到10
3、創(chuàng)建keystore。命令:
? ? ? keytool -genkey -alias <別名> -keypass <密鑰口令> ?-keyalg Test -keysize 1024 -validity 365 -keystore <庫文件名,如runcerts.keystore> -storepass <證書庫密碼> -dname "cn=testUsr, ou=產(chǎn)品部, o=XXX公司, c=CN, S=shandong" -storetype BKS -provider org.bouncycastle.jce.provider.BouncyCastleProvider
?4、簽名及驗證
? ?//讀取密鑰庫:
? ?FileInputStream is=new FileInputStream("C:\\Inetpub\\runcerts.keystore");
? ? KeyStore ks=KeyStore.getInstance("BKS","BC");
? ? ks.load(is,"123456".toCharArray());
? ?is.close();
??
//讀取私鑰
?PrivateKey priKey1=(PrivateKey)ks.getKey("test2", "123456".toCharArray());
? privateKeyString =getKeyString(priKey1);
//簽名
? ?SignText=DataSign(plainText,privateKeyString);?
//以下驗證 ?
? ? //獲得證書
? Certificate certificate=ks.getCertificate("test2");
? //獲得證書
? PublicKey publicKey1=certificate.getPublicKey();
??
? publicKeyString=getKeyString(publicKey1);
??
//驗證
? byte[]plainText1="Happy New Year!!Email:@qq.com".getBytes();?
? boolean verySign=verify(plainText1,publicKeyString,SignText);
? String s2 = new Boolean(verySign).toString();
? System.out.print("驗證結(jié)果:"+s2+"/n");
?
說明:大體是這個步驟,具體還有一些細(xì)節(jié)代碼沒有粘貼。
?
Android應(yīng)用數(shù)字簽名詳解
標(biāo)簽: androidandroid studiokeytool-簽名
2015-11-26 15:23 5163人閱讀 評論(0) 收藏 舉報
? 分類:
Android應(yīng)用開發(fā)(94) ?
版權(quán)聲明:本文為博主原創(chuàng)文章,未經(jīng)博主允許不得轉(zhuǎn)載。
目錄(?)[+]
目錄
? 目錄
? 概述
? 數(shù)字簽名證書生成方法
o 命令行工具keytooljarsinger
o Android Studio
o 小結(jié)
? 查看應(yīng)用簽名信息
o 查看自簽名證書的信息
o 查看第三方應(yīng)用或Android系統(tǒng)應(yīng)用簽名證書信息
________________________________________
概述
Android系統(tǒng)要求所有的應(yīng)用必須被證書進(jìn)行數(shù)字簽名之后才能進(jìn)行安裝。android系統(tǒng)通過該證書來確認(rèn)應(yīng)用的作者,該證書是不需要權(quán)威機(jī)構(gòu)認(rèn)證的,一般情況下應(yīng)用都是用開發(fā)者的自簽名證書,該證書是確保應(yīng)用程序和應(yīng)用程序作者之間建立信任關(guān)系,而不是用來決定用戶可以安裝哪些應(yīng)用程序。
應(yīng)用進(jìn)行數(shù)字簽名的好處和注意事項如下:
1. Android所有的應(yīng)用程序必須要有數(shù)字證書簽名,Android系統(tǒng)不會安裝一個沒有數(shù)字證書簽名的程序。
2. Android系統(tǒng)中,系統(tǒng)app使用的是平臺證書簽名,而第三方app一般使用開發(fā)者的自簽名證書。
3. Release版本的第三方app(例如淘寶、支付寶、微信),必須使用一個合適私鑰生成的數(shù)字證書來給程序進(jìn)行簽名,并且保證每次的迭代新版本都是使用相同的證書進(jìn)行數(shù)字簽名。不然的話,新版本和舊版本的數(shù)字證書不一致,Android系統(tǒng)會認(rèn)為這是兩個不同的app,導(dǎo)致更新等操作失敗。
4. 數(shù)字證書是存在有效期的,這也決定了app的預(yù)計生命周期,如果數(shù)字證書超期失效,則應(yīng)用無法安裝或者無法正常升級。
5. Android提供了基于簽名的權(quán)限機(jī)制,那么一個應(yīng)用程序就可以為另一個以相同證書簽名的應(yīng)用程序公開自己的功能。以同一個證書對多個應(yīng)用程序進(jìn)行簽名,利用基于簽名的權(quán)限檢查,你就可以在應(yīng)用程序間以安全的方式共享代碼和數(shù)據(jù)了。 不同的應(yīng)用程序之間,想共享數(shù)據(jù),或者共享代碼,那么要讓他們運行在同一個進(jìn)程中,而且要讓他們用相同的證書簽名。
________________________________________
數(shù)字簽名證書生成方法
聲明:實驗生成的keystore只是作為演示使用,并沒有實際應(yīng)用到項目中。大家參考時也要根據(jù)我的博客手工修改部分參數(shù),切忌無腦照抄!
Android是使用標(biāo)準(zhǔn)的Java工具keytool和jarsigner來生成數(shù)字證書,而目前市場上第三方IDE(Android Studio和Eclipse)都是通過圖形化系統(tǒng)幫我們封裝了這兩個工具的具體執(zhí)行步驟。?
接下來,我會介紹兩種生成數(shù)字簽名證書的方式,分別通過命令行和Android Studio進(jìn)行生成。
________________________________________
命令行工具(keytool&&jarsinger)
由于Android的數(shù)字簽名證書是用java標(biāo)準(zhǔn)工具生成的(路徑為:$JAVA_HOME/bin目錄下),那我們當(dāng)然可以在命令行生成數(shù)字證書了,具體方法如下。
1. 使用keytool生成數(shù)字簽名證書。示例命令如下:
keytool -genkey -v -keystore my-release-key.keystore -alias alias_name -keyalg RSA -keysize 2048 -validity 10000
? 1
? 1
參數(shù)詳解:
? -keystore : 指定生成數(shù)字簽名證書的文件名和路徑。
? -alias:指定證書的別名。
? -keyalg:指定生成證書所需要的算法。
? -keysize:指定證書大小。
? -validity:指定證書的有效期,單位為天。
示例截圖如下:?
?
1. 使用生成的keystore,利用jarsinger為應(yīng)用進(jìn)行簽名。示例命令如下:
jarsigner -verbose -sigalg SHA1withRSA -digestalg SHA1 -keystore my-release-key.keystore my_application.apk alias_name
? 1
? 1
參數(shù)詳解:
? -sigalg:簽名算法的名稱。
? -digestalg:摘要算法的名稱。
? -keystore : 指定簽名證書的位置。
? alias_name:簽名證書的別名。
示例截圖如下:
?
1. google官方同時推薦使用zipalign工具對簽名的apk進(jìn)行優(yōu)化。該工具位于Android SDK的/build-tools/版本號/目錄下。示例命令如下:
zipalign -v 4 your_project_name-unaligned.apk your_project_name.apk
? 1
? 1
示例截圖如下:?
?
________________________________________
Android Studio
使用命令行的方式可以顯得geek,并且讓我們更多的了解實現(xiàn)細(xì)節(jié)。但是,平時應(yīng)用開發(fā)中更多的是注重效率,因此,我們可以采用目前google官方推薦的AS幫我們實現(xiàn)應(yīng)用數(shù)字簽名功能。具體步驟如下。
1. 選擇編譯Module->Build->Generate Signed APK->選擇編譯Module->Next。
?
1. 選擇Create new,創(chuàng)建一個新的數(shù)字簽名證書。?
?
2. 填寫證書信息。?
?
填寫完成之后,我們點擊OK,就可以生成我們的數(shù)字簽名證書了。
上述工作完成后,我們就生成了數(shù)字簽名證書,但是還沒有對我們的apk進(jìn)行簽名。想要用生成的數(shù)字證書對apk進(jìn)行簽名,還需要修改當(dāng)前Module的build.gradle文件,增加簽名命令,具體內(nèi)容如下:
android {
? ? compileSdkVersion 19
? ? buildToolsVersion "19.1.0"
? ? defaultConfig {
? ? ? ? applicationId "××××××"
? ? ? ? minSdkVersion 8
? ? ? ? targetSdkVersion 19
? ? }
? ? signingConfigs {
? ? ? ? debug {
? ? ? ? ? ? // 配置debug版本的數(shù)字簽名證書
? ? ? ? ? ? storeFile file("/home/wzy/Documents/keystore/simple-weather.jks")
? ? ? ? ? ? storePassword "123456"
? ? ? ? ? ? keyAlias "release-key"
? ? ? ? ? ? keyPassword "123456"
? ? ? ? }
? ? ? ? release {
? ? ? ? ? ? // 配置release版本的數(shù)字簽名證書(為了方便,這里的release版本和debug版本共用一個數(shù)字簽名證書)
? ? ? ? ? ? storeFile file("/home/wzy/Documents/keystore/simple-weather.jks")
? ? ? ? ? ? storePassword "123456"
? ? ? ? ? ? keyAlias "release-key"
? ? ? ? ? ? keyPassword "123456"
? ? ? ? }
? ? }
? ? buildTypes {
? ? ? ? release {
? ? ? ? ? ? // 配置release版本的數(shù)字簽名
? ? ? ? ? ? signingConfig signingConfigs.release
? ? ? ? ? ? minifyEnabled false
? ? ? ? ? ? proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt'
? ? ? ? }
? ? ? ? debug {
? ? ? ? ? ? // 配置debug版本的數(shù)字簽名
? ? ? ? ? ? signingConfig signingConfigs.debug
? ? ? ? }
? ? }
? ? lintOptions {
? ? ? ? abortOnError false
? ? }
}
? 1
? 2
? 3
? 4
? 5
? 6
? 7
? 8
? 9
? 10
? 11
? 12
? 13
? 14
? 15
? 16
? 17
? 18
? 19
? 20
? 21
? 22
? 23
? 24
? 25
? 26
? 27
? 28
? 29
? 30
? 31
? 32
? 33
? 34
? 35
? 36
? 37
? 38
? 39
? 40
? 41
? 42
? 43
? 1
? 2
? 3
? 4
? 5
? 6
? 7
? 8
? 9
? 10
? 11
? 12
? 13
? 14
? 15
? 16
? 17
? 18
? 19
? 20
? 21
? 22
? 23
? 24
? 25
? 26
? 27
? 28
? 29
? 30
? 31
? 32
? 33
? 34
? 35
? 36
? 37
? 38
? 39
? 40
? 41
? 42
? 43
當(dāng)然,上述命令A(yù)ndroid Studio也提供了圖形化界面進(jìn)行操作,可以直接在Module Settings進(jìn)行設(shè)置,截圖如下(ps:我還是喜歡手動配置)。?
?
________________________________________
小結(jié)
Android應(yīng)用可以在debug和release兩種模式下進(jìn)行數(shù)字證書簽名。在Android Studio中,我們直接點擊Run使用的是debug模式,我們在命令行敲擊bash gradle :$module_name:build使用的是release模式。?
debug模式下簽名是為了開發(fā)調(diào)試,release模式下進(jìn)行簽名則是為了正式發(fā)布。?
Android SDK提供了一個不需要密碼的證書用于在debug模式下進(jìn)行簽名調(diào)試,默認(rèn)存儲在$HOME/.android/debug.keystore,但是release版本必須使用自己的數(shù)字簽名證書。
________________________________________
查看應(yīng)用簽名信息
首先,為什么我們需要查看應(yīng)用簽名信息呢?
是因為,很多第三方提供的SDK服務(wù)為了區(qū)分應(yīng)用必須讓我們提供數(shù)字簽名的SHA1值,例如百度地圖定位SDK、高德地圖定位SDK,為了使用這些服務(wù),我們就必須學(xué)會如何查看應(yīng)用簽名信息。
________________________________________
查看自簽名證書的信息
我們自簽名的證書,由于keystore文件存在于我們可訪問的路徑下,我們可以直接通過keytool命令去查看證書信息。
示例命令如下:
keytool -v -list -keystore ?my-release-key.keystore
? 1
? 1
輸入命令后,是需要輸入簽名密碼的。
參數(shù)詳解:
? -list:列出密鑰庫中的條目。
? -keystore:數(shù)字證書位置。
示例截圖如下:?
?
________________________________________
查看第三方應(yīng)用或Android系統(tǒng)應(yīng)用簽名證書信息
其實系統(tǒng)應(yīng)用對開發(fā)者來說也是第三方應(yīng)用,但是只要我們能拿到它的apk,就能知道它的應(yīng)用簽名信息。以我目前使用的樂運動apk為例(com.oxygen.www_3.0_40.apk)。
1. 用unzip命令解壓apk。
unzip com.oxygen.www_3.0_40.apk
? 1
? 1
1. 進(jìn)入META-INF文件,找到其中的CERT.RSA文件。
2. 使用keytool工具進(jìn)行信息查看,具體命令如下:
keytool -printcert -file CERT.RSA
? 1
? 1
參數(shù)詳解:
? -printcert:打印證書內(nèi)容
示例截圖如下:?
?
?
加密解密,數(shù)字簽名及證書
標(biāo)簽: 解密
2016-12-12 16:43 1129人閱讀 評論(0) 收藏 舉報
? 分類:
加密解密 android開發(fā)(28) ?
版權(quán)聲明:本文為博主原創(chuàng)文章,未經(jīng)博主允許不得轉(zhuǎn)載。
目錄(?)[+]
對稱加密
分類
1. 數(shù)據(jù)加密標(biāo)準(zhǔn)DES(56位密鑰長度,密鑰太短,抗窮舉能力差,安全性不夠)
2. 三重DES-DESede(112和168兩種密鑰長度,抗窮舉能力顯著增強(qiáng), 但由于進(jìn)行了多重des迭代,造成處理速度慢,效率不高)
3. 高級數(shù)據(jù)加密標(biāo)準(zhǔn)AES(128和192及256三種密鑰長度,搞窮舉能力強(qiáng),速度比des系列加密快,為替代des系列加密算法而生)
對稱加密步驟
1. 由消息傳遞雙方約定密鑰
2. 消息發(fā)送方使用密鑰對明文加密,并將密文發(fā)送給接收方
3. 消息接收方使用密鑰對密文解密獲取明文
?
對稱加密的問題
1. 甲與乙通信,甲乙事先需要打電話或者發(fā)郵件或者面對面約定密鑰key1
2. 甲與丙通信,甲丙事先需要打電話或者發(fā)郵件或者面對面約定密鑰key2
3. 甲與丁通信,甲丁事先需要打電話或者發(fā)郵件或者面對面約定密鑰key3
如果甲要與N方通信,就得事先打電話或者發(fā)郵件或者面對面與N方約定N個密鑰,以瀏覽器為例,其會與數(shù)不清的網(wǎng)站通信,瀏覽器開發(fā)者不可能事先打電話或者發(fā)郵件或者面對面與各個網(wǎng)站開發(fā)者約定密鑰。
所以問題來了,通信兩方該如何事先約定密鑰呢,顯然打電話或者發(fā)郵件或者面對面這種人工約定密鑰的方式是不可行的,這時需要非對稱加密算法來解決這個問題了。
非對稱加密
分類
非對稱加密算法也比較多,典型常用的有dsa,rsa算法
特點
1. 每個通信方都有一對密鑰,公鑰和私鑰,公鑰對外公開,私鑰自己保存不對外公開
2. 公鑰加密的數(shù)據(jù)必須用其對應(yīng)的私鑰才能解密,私鑰加密的數(shù)據(jù)必須用其對應(yīng)的公鑰才能解密
非對稱加密的這些特點,即可解決上述人工交換對稱加密算法密鑰的問題,具體見下圖
加密流程
?
以上就是對數(shù)據(jù)加密的介紹,可以看到,數(shù)據(jù)加密可以保證縱使數(shù)據(jù)被敵人竊取,也無法識別出具體內(nèi)容,達(dá)到數(shù)據(jù)的保密性。但假如竊取者將這個無法識別的數(shù)據(jù)替掉,換成具有誤導(dǎo)性錯誤的數(shù)據(jù)發(fā)送給數(shù)據(jù)接收方,那么數(shù)據(jù)接收方該如何識別收到的數(shù)據(jù)是否真實的,沒有被竄改的呢?如下圖這種情況
?
要解決上面問題,需要利用數(shù)據(jù)摘要和簽名對數(shù)據(jù)進(jìn)行完整性驗證及身份識別
數(shù)據(jù)摘要
定義
固名思義,就是取數(shù)據(jù)的摘要,大綱,特征碼
分類
主要有md系列和sha系列算法?
1. md系列又分md2,md4,md5等,比較常用的就是md5,無論數(shù)據(jù)有多長,md算法都會生成一個128位的摘要,來表征這個數(shù)據(jù)。?
2. sha系列也分很多種,sha-0,sha-1,sha-2,sha-256等等,常用的是sha-1算法,其會對數(shù)據(jù)生成一個160位的摘要,來表征這個數(shù)據(jù)。
摘要算法驗證數(shù)據(jù)完整性流程
1. 通信雙方約定摘要算法
2. 數(shù)據(jù)發(fā)送方獲取數(shù)據(jù)的摘要m,將數(shù)據(jù)和其摘要m一起發(fā)給接收方
3. 接收方取得獲取的數(shù)據(jù),并利用約定的摘要算法計算數(shù)據(jù)的摘要m2,與收到的摘要m比較,相等說明數(shù)據(jù)沒有被更改
但上述驗證其實是有bug的,見如下圖?
?
如何解決bug了,這時需要用到mac算法
MAC消息認(rèn)證碼算法
MAC是結(jié)合了摘要和對稱加密算法的摘要算法(個人認(rèn)為也是一種簽名算法,后面會看不到其不僅可以驗證完整性還可以認(rèn)證數(shù)據(jù)源),可以認(rèn)為就是相比前的摘要算法多了一步,就是對摘要結(jié)果進(jìn)行一次加密后的數(shù)據(jù)作為最終結(jié)果。
分類
主要有HmacMD5, HMacSHA1, HMacSH256, HMacSHA384等等,與前面的摘要算法都是對應(yīng)的
mac消息認(rèn)證算法驗證數(shù)據(jù)完整性流程
1. 通信雙方約定mac算法和密鑰
2. 數(shù)據(jù)發(fā)送方獲取數(shù)據(jù)的認(rèn)證碼m,將數(shù)據(jù)和其認(rèn)證碼m一起發(fā)給接收方
3. 接收方取得傳來的數(shù)據(jù),并利用約定的mac算法和密鑰計算數(shù)據(jù)的認(rèn)證碼m2,與收到的認(rèn)證碼m比較,相等說明數(shù)據(jù)沒有被更改
看上去與摘要驗證流程相比沒有差別,就多了一個密鑰,但就是多的這個密鑰,解決了前面摘要算法進(jìn)行數(shù)據(jù)完整性驗性的bug,具體見下圖
?
另外從上圖也可以看出,mac消息認(rèn)證碼不僅可以驗證數(shù)據(jù)完整性,還可以認(rèn)證數(shù)據(jù)發(fā)送方身份,因為mac所用的密鑰只有通信雙方才知道,截竊不知道這個key就無法生成正確的code,數(shù)據(jù)接收方就無法通過驗證。當(dāng)數(shù)據(jù)接收方一旦通過了驗證,不僅說明數(shù)據(jù)是完整的,并且說明數(shù)據(jù)發(fā)送方?jīng)]有被委造。
數(shù)字簽名
什么是數(shù)字簽名
數(shù)字簽名可以認(rèn)為是帶密鑰的數(shù)據(jù)摘要算法,并且這種密鑰使用的是公鑰和私鑰,是數(shù)據(jù)摘要和非對稱加密的結(jié)合體。類似手寫簽名,主要是用來驗證數(shù)據(jù)完整性和認(rèn)證數(shù)據(jù)來源。
其校驗和認(rèn)證流程分為以下幾步:?
1. 消息發(fā)送方公布自己的公鑰?
2. 消息發(fā)送方利用自己的私鑰對數(shù)據(jù)簽名得到簽名值,并將數(shù)據(jù)和簽名值一起發(fā)送給接收方?
3. 接收方利用發(fā)送方的公鑰對數(shù)據(jù)和簽名值進(jìn)行驗簽
?
?
可見與上述消息認(rèn)證碼校驗流程非常相似,并且可以知道簽名時是私鑰加密,公鑰解密,與之前加密數(shù)據(jù)(交換密鑰)時相反,那里是公鑰加密,私鑰解密
簽名算法分類
主要包括RSA,DSA和ECDSA共三種算法
數(shù)字證書
回顧前面瀏覽器與銀行通過非對稱加密算法進(jìn)行交互通信密鑰的流程圖
?
要解決這個問題用到數(shù)字證書
數(shù)字證書是什么
數(shù)字證書類似我們的身份證,用于標(biāo)識通信方的身份,其本身就是一個格式規(guī)范的文件,如下圖所示
?
其中最重要的信息有簽發(fā)機(jī)構(gòu),簽發(fā)機(jī)構(gòu)簽名,證書的持有者名稱,證書持有者的公鑰
證書每個人都可以制作,但需要到權(quán)威機(jī)構(gòu)作認(rèn)證,否則沒有可信性。
有了證書,就不用擔(dān)心假冒銀行網(wǎng)站了,仍以前面例子為例,瀏覽器向銀行請求公鑰,其實應(yīng)該是請求銀行的證書(證書里有公鑰),假設(shè)瀏覽器請求被劫持到一個假冒銀行,瀏覽器收到假冒銀行自己的制作的證書,瀏覽器發(fā)現(xiàn)這個沒有被權(quán)威機(jī)構(gòu)認(rèn)證,不可信,就會中斷通信,所以沒安全問題。再假如假冒銀行拿到真招行的數(shù)字證書返回給瀏覽器(這個可以拿到,證書是公開的,想拿都可以拿),瀏覽器通過驗證,發(fā)現(xiàn)證書是真的,就用證書上的真招行的公鑰加密通過密鑰key返回給假冒銀行,這時也沒有問題,因為這個key是用真招行的公鑰加密的,需要用真招行的私鑰來解密,而假銀行沒有招行的私鑰,無法解密,他得不到真實的通信密鑰key,這也是安全的,密鑰沒有泄露。
前面一直說瀏覽器可以判斷一個證書是經(jīng)過權(quán)威機(jī)構(gòu)認(rèn)證了的還是自己制作的不可靠的證書,這是如何做到的呢?見下圖
?
瀏覽器已經(jīng)內(nèi)置了這些權(quán)威證書認(rèn)證機(jī)構(gòu)的公鑰,所以可以利用這些公鑰來判斷證書是不是那個權(quán)威機(jī)構(gòu)認(rèn)證過的。
簽名證書VS加密證書
博客分類:?
? PKI
數(shù)字證書?
從證書的用途來看,數(shù)字證書可以分為:
?簽名證書:主要用于對用戶信息進(jìn)行簽名,以保證信息的不可否認(rèn)性。
?加密證書:主要用于對用戶傳送信息進(jìn)行加密,以保證信息的真實性和完整性。
?
什么是加密證書和簽名證書??
? ? ? ?
? ? 數(shù)字證書可分為簽名證書和加密證書。
? ? 簽名證書主要用于對用戶信息進(jìn)行簽名,以保證信息的有效性和不可否認(rèn)性;
? ? 加密證書主要用于對用戶傳送信息進(jìn)行加密,以保證信息的保密性和完整性。
? ? 每個證書都包含一對密鑰即簽名公鑰和簽名私鑰,加密公鑰和加密私鑰,將簽名證書和加密證書的公鑰公布于外。
? ? 簽名時,用簽名證書的私鑰進(jìn)行簽名,其他用戶可以利用公布于外網(wǎng)的簽名公鑰對簽名進(jìn)行驗證。
? ? 加密時,用戶B利用用戶A公布于外網(wǎng)的加密公鑰對信息進(jìn)行加密傳送給用戶A,用戶A利用自己的加密私鑰對加密后的信
? ? 息進(jìn)行解密得到完整的明文信息。
?
=================================================================
?
數(shù)字證書格式-摘要
?版本 :該證書使用的是哪種版本的X.509標(biāo)準(zhǔn)
?序列號:本項是CA分配給每一個證書的唯一的數(shù)字型編號,證書序列號的長度在不同的
? CA系統(tǒng)中是可配置的。
?簽名算法:本項用來指定頒發(fā)機(jī)構(gòu)CA簽發(fā)證書時使用的簽名算法
?頒發(fā)者:issuer 本項標(biāo)識了頒發(fā)該證書的機(jī)構(gòu)DN
?有效期:validity 本項是證書的有效期和終止日期
?主題:subject 證書擁有者的唯一是別名,這個字段必須是非空的。
? ? ?有效的DN(Distinct Name)標(biāo)識:
? ? ? ?c ? ? ? ? ?country code (一般是c=cn)
? ? ? ?o ? ? ? ? ?organization(組織)
? ? ? ?ou ? ? ? ?organizational unit name(組織單位名)
? ? ? ?cn ? ? ? ?common name (普通名)
? ? ? ?e ? ? ? ? ?email (郵件地址)
? ? ? ?l ? ? ? ? ? locality name (地址)
? ? ? ?st ? ? ? ? state, or province name (國家或省份名)
? ? ? ?dc ? ? ? ?domain Component (領(lǐng)域)
? ? ? ?uid ? ? ?user id (用戶標(biāo)識符)
? ? ? ?t ? ? ? ? ?title (標(biāo)題)
? ? ? ?sn ? ? ? ?device serial number name
?公鑰 public key: 本項用來標(biāo)識公鑰,公鑰算法和公鑰長度。
?微縮圖算法:和證書本身沒多大關(guān)系,就是哈希算法,通常用MD5或SHA1.
?微縮圖:是指對整個證書進(jìn)行hash運算之后生成的一段數(shù)據(jù),就是對證書的哈希摘要。
android要求所有的程序必須有簽名,否則就不會安裝該程序。在我們開發(fā)過程中,adt使用debug keystore,在 preference->android->buid中設(shè)置。debug的keystore默認(rèn)有效期為一年,如果你是從一年前開始開發(fā) android程序,那么很可能出現(xiàn)debug keystore過期,導(dǎo)致你無法生成 apk文件。我調(diào)了一下系統(tǒng)時間,就出現(xiàn)以下錯誤。此時你只要刪除debug keystore就行,系統(tǒng)又會為你生成有效期為一年的私鑰。
當(dāng)debug keystore過期,會出現(xiàn)如下的錯誤:
Error generating final archive: Debug Certificate expired on…
debug keystore刪除方法:
進(jìn)入C:\Documents and Settings\Administrator\.android 刪除路徑下的debug.keystore及 ddms.cfg。
(不同環(huán)境下的目錄可能略有不同,可在eclipse中查找此路徑:Window->Preferences->Android->Build下 Default debug keystore)
然后重新導(dǎo)入即可。
ubuntu環(huán)境下的解決辦法: ?rm -rf ?~/.android/debug.keystore?
當(dāng)你release時,你可以用 右擊項目->android tools->export signed android package生成簽名的包。再此過程中,如果你還沒有你自己的私鑰,adt會自動調(diào)用 keytool 來為你生成。請保護(hù)好你的私鑰,否則被人盜用的話,就用攻擊你的簽名程序了。
release前還應(yīng)注意版本號,在manifest.xml中有兩個字段android:versionCode="1"和 android:versionName="1.0",其中前者是給程序或者android使用,以1遞增。后者是給用戶看的,在這里你就可以使用主版本 號 次版本號 build號等字符串。
---------------------------------------
keystore的生成:
cmd下:
進(jìn)入到j(luò)dk的bin目錄,這樣的話,android.keystore文件就會生成在這個目錄下,簽名的時候我們需要這個文件
D:\Program Files\Java\jdk1.6.0_20\bin>keytool -genkey -alias android.keystore -keyalg RSA -validity 20000 -keystore android.keystore
輸入keystore密碼:
再次輸入新密碼:
您的名字與姓氏是什么?
? [Unknown]: ?qiaoling您的組織單位名稱是什么?
? [Unknown]: ?www.chinaandroid.com
您的組織名稱是什么?
? [Unknown]: ?www.chinaandroid.com
您所在的城市或區(qū)域名稱是什么?
? [Unknown]: ?haidian
您所在的州或省份名稱是什么?
? [Unknown]: ?BJ
該單位的兩字母國家代碼是什么
? [Unknown]: ?86
CN=qiaoling, OU=www.chinaandroid.com, O=www.chinaandroid.com, L=haidian, ST=BJ, C=86 正確嗎?
? [否]: ?Y
輸入<android.keystore>的主密碼(如果和 keystore 密碼相同,按回車):
其中參數(shù)-validity為證書有效天數(shù),這里我們寫的大些10000天。還有在輸入密碼時沒有回顯(盡管輸就是啦) 并且 退格,tab等都屬于密碼內(nèi)容,這個密碼在給.apk文件簽名的時候需要.
?
然后簽名:
Eclipse中,右擊需要簽名的工程-->android tools-->export signed application package...
出現(xiàn)下面對話框,選擇需要簽名的工程
next,選擇上面生成的android.keystore文件位置和設(shè)置的密碼
next
next,選擇簽名生成文件的位置和名稱
keykeytool錯誤: java.io.FileNotFoundException: android.key (Permission denied)
tool 在JDK的/bin目錄下,比如:/opt/jdk/bin
用以下的命令生成一個證書:
keytool -genkey -alias android.key -keyalg RSA -validity 20000 -keystore android.key
老是報如題的錯誤:
后來才知道是因為當(dāng)前的目錄下沒有寫的權(quán)限,所以需要指定一個路徑來存放android.key:
keytool -genkey -alias android.key -keyalg RSA -validity 20000 -keystore /<MY_PATH>/android.key
注: 該單位的兩字母國家代碼是什么(中國是 CN)
打包的時候如果出現(xiàn): jarsigner: 找不到 android.key 的證書鏈。android.key 必須引用包含專用密鑰和相應(yīng)的公共密鑰證書鏈的有效密鑰庫密鑰條目。
那么可能是 -alias 部分多了路徑名導(dǎo)致與其后面的keystore不同名。
查看證書信息:
keytool -list -v -keystore android.key -storepass <PSW>
keystore信息的查看
本文系轉(zhuǎn)載,原文地址:http://dev.10086.cn/cmdn/bbs/thread-58334-1-1.html
?
keystore信息的查看:
keytool -list -v -keystore e:\keytool\yushan.keystore -storepass 123456
顯示內(nèi)容:
---------------------------------------------------------------------
Keystore 類型: JKS
Keystore 提供者: SUN
您的 keystore 包含 1 輸入
別名名稱: yushan
創(chuàng)建日期: 2009-7-29
項類型: PrivateKeyEntry
認(rèn)證鏈長度: 1
認(rèn)證 [1]:
所有者:CN=yushan, OU=xx公司, O=xx協(xié)會, L=湘潭, ST=湖南, C=中國
簽發(fā)人:CN=yushan, OU=xx公司, O=xx協(xié)會, L=湘潭, ST=湖南, C=中國
序列號:4a6f29ed
有效期: Wed Jul 29 00:40:13 CST 2009 至Thu Jul 29 00:40:13 CST 2010
證書指紋:
MD5:A3:D7:D9:74:C3:50:7D:10:C9:C2:47:B0:33:90:45:C3
SHA1:2B:FC:9E:3A:DF:C6:C4:FB:87:B8:A0:C6:99:43:E9:4C:4A:E1:18:E8
簽名算法名稱:SHA1withRSA
版本: 3
--------------------------------------------------------------------
缺省情況下,-list 命令打印證書的 MD5 指紋。而如果指定了 -v 選項,將以可讀格式打印證書,如果指定了 -rfc 選項,將以可打印的編碼格式輸出證書。
keytool -list -rfc -keystore e:\yushan.keystore -storepass 123456
顯示:
-------------------------------------------------------------------------------------------------------
Keystore 類型: JKS
Keystore 提供者: SUN
您的 keystore 包含 1 輸入
別名名稱: yushan
創(chuàng)建日期: 2009-7-29
項類型: PrivateKeyEntry
認(rèn)證鏈長度: 1
認(rèn)證 [1]:
-----BEGIN CERTIFICATE-----
MIICSzCCAbSgAwIBAgIESm8p7TANBgkqhkiG9w0BAQUFADBqMQ8wDQYDVQQGDAbkuK3lm70xDzAN
BgNVBAgMBua5luWNlzEPMA0GA1UEBwwG5rmY5r2tMREwDwYDVQQKDAh4eOWNj+S8mjERMA8GA1UE
CwwIeHjlhazlj7gxDzANBgNVBAMTBnl1c2hhbjAeFw0wOTA3MjgxNjQwMTNaFw0xMDA3MjgxNjQw
MTNaMGoxDzANBgNVBAYMBuS4reWbvTEPMA0GA1UECAwG5rmW5Y2XMQ8wDQYDVQQHDAbmuZjmva0x
ETAPBgNVBAoMCHh45Y2P5LyaMREwDwYDVQQLDAh4eOWFrOWPuDEPMA0GA1UEAxMGeXVzaGFuMIGf
MA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCJoru1RQczRzTnBWxefVNspQBykS220rS8Y/oX3mZa
hjL4wLfOURzUuxxuVQR2jx7QI+XKME+DHQj9r6aAcLBCi/T1jwF8mVYxtpRuTzE/6KEZdhowEe70
liWLVE+hytLBHZ03Zhwcd6q5HUMu27du3MPQvqiwzTY7MrwIvQQ8iQIDAQABMA0GCSqGSIb3DQEB
BQUAA4GBAGoQQ1/FnTfkpQh+Ni6h3fZdn3sR8ZzDMbOAIYVLAhBb85XDJ8QZTarHbZMJcIdHxAl1
i08ct3E8U87V9t8GZFWVC4BFg/+zeFEv76SFpVE56iX7P1jpsu78z0m69hHlds77VJTdyfMSvtXv
sYHP3fxfzx9WyhipBwd8VPK/NgEP
-----END CERTIFICATE-----
2、查看md5指紋驗證
輸入keytool -list -v -alias ?android.keystore -keystore 再加上所要查看的keystore所在的路徑
如: keytool -list -v -alias androiddebugkey -keystore d:\android.keystore,回車
-alias android.keystore 這個是別名
-keystore d:\android.keystore 具體位置的密鑰庫
要求輸入密碼,密碼是android,至此就可以拿到MD5認(rèn)證指紋了
keytool -genkeypair -keystore zrong2.p12 -storetype pkcs12 -validity 8050
keytool -list -keystore zrong2.p12 -storetype pkcs12 -v
二、使用p12證書為apk簽名
將 p12 文件轉(zhuǎn)成jks或者keystore文件就可以在ADT中使用了。
先創(chuàng)建一個空的 jks文件
1. keytool -genkey -alias anyname -keystore yourcertificate.jks
2. keytool -genkey -alias anyname -keystore yourcertificate.keystore
導(dǎo)入p12證書
1. keytool -importkeystore -srckeystore yourcertificate.p12 -srcstoretype PKCS12 -destkeystore yourcertificate.jks -deststoretype JKS
2. keytool -importkeystore -srckeystore yourcertificate.p12 -srcstoretype PKCS12 -destkeystore yourcertificate.keystore -deststoretype JKS
現(xiàn)在可以使用這個JKS文件了。
總結(jié)
- 上一篇: arial unicode ms字体_(
- 下一篇: 前端学习(2026)vue之电商管理系统