2007年3月14日 星期三

如何取得可信任的個人憑証(Certificate)

何謂Certificate(憑證):

與特定「主體」之「公開金鑰」有關、並經過數位簽署的一份「聲明」,而簽署者即為該份憑証的「發行者」(所以「發行者」也必須握有另一對私密與公開金鑰)。您也可以把憑證稱為「數位身份證」。

如何取得個人第一份可信任憑証?
微軟提供了一個可信任憑証碼產生工具,你可以由下列位址下載
http://www.microsoft.com/downloads/details.aspx?familyid=2b742795-d0f0-4a66-b27f-22a95fcd3425&displaylang=en#filelist
依作業系統下載檔案後(我是windows系統,所以下載codesigningx86.exe),將其解壓縮,可得到以下檔案
cert2spc.exe
certmgr.exe
chktrust.exe
makecat.exe
makecert.exe
makectl.exe
setreg.exe
signcode.exe
我們將利用makecert.exe產生屬於個人的第一個可信任憑証。

個人憑証檔產生步驟:
在COMMAND視窗中,輸入下列指令
makecert -r -cy both -sv tbof.key -eku 1.3.6.1.5.5.7.3.3 -n "CN=TBOF" tbof.cer
此命令將產生一個給TBOF的相關憑証檔,共計產生二個檔案,tbof.key與tbof.cer,其中.cer內容將會寫入手機中

cert2spc tbof.cer tbof.spc
此命令將產生一個.spc的檔案,供將來簽名程序時使用

其間會出現要求輸入密碼,若你不想使用,將其保留空白,直接繼續即可。如此一來,你就有了第一份屬於自己的可信任憑証檔。



如何將自己的可信任憑証以特權憑証模式寫入行動裝置?

為何行動裝置中的程式需要憑証?
安全性:為了避免程式被不知名第三者修改,導致程式不可信任。(如漢化、破解、植入病毒等)
可靠性:若程序的簽名憑証是由手機開發者所信任單位發出。則表示程序是經過手機開發者測試通過,是可靠的,不會造成手機系統崩潰等問題。安裝時,將不會出現任何警告訊息。

漢化者為何需要將自己的可信任憑証寫入行動裝置中,成為特權憑証?
手機中,部份注冊表與文件,必需以特權模式方能呼叫與修改,故部份程序開發者,在安裝程序時,藉由寫入自己的特權憑証,以確保其程序能正常執行。
如QPTools與Contacts Menu等軟件,這些軟件最明顯的特徵是CAB包中的_setup.xml可找到以下字串
<characteristic type="CertificateStore">
<characteristic type="Privileged Execution Trust Authorities">
這也是為何這類程序一但漢化或修改破解後,程序將無法運行。
原因是漢化者無法取得開發者的特權憑証,所以漢化後,漢化者重新寫入的憑証無法取得系統特權模式,使程序無法運行。
解決方法是,將自己的憑証先寫入手機中成為特權憑証。
缺點,漢化程序必需提供漢化者的憑証安裝檔(.xml)供使用者寫入其手機。若能做成CAB包對一般使用者會較方便。
特權憑証僅需安裝一次,若漢化者都使用同一個憑証檔。

將個人憑証以特權憑証模式寫入手機的步驟:
先取得openssl.exe檔,昨晚google找了一陣才找到windows下的(openssl.win32.097c.zip)雖不是最新版本,但已經夠用了。
目的是為了得到個人憑証的sha1碼與憑証的bas64編碼。
另外再取得rapiconfig.exe(可由smartphone SDK中取得),我放在附件中。

在COMMAND視窗中,輸入下列指令
1.建立憑証安裝檔
openssl sha1 tbof.cer
其中tbof.cer為剛才取得的憑証檔,畫面中將產生一組40個字元的SHA1數據。

openssl base64 < tbof.cer
畫面中將產生tbof.cer裏面內容的Base64編碼。

取得以上的數據後,將數值依序填入下面的相對位置,BASE64最好填成一行,以免出現不可預期的錯誤,將內容存成.xml檔
<wap-provisioningdoc>
<characteristic type="CertificateStore">
<characteristic type="Privileged Execution Trust Authorities">
<characteristic type="...SHA1...">
<parm name="EncodedCertificate" value="...BASE64..."/>
</characteristic>
</characteristic>
</characteristic>
</wap-provisioningdoc>

以我的為例tbof.xml內容為
<wap-provisioningdoc>
<characteristic type="CertificateStore">
<characteristic type="Privileged Execution Trust Authorities">
<characteristic type="451b30370017237eae8aec08e47b6d855a7cb253">
<parm name="EncodedCertificate" value="MIIBgjCCASygAwIBAgIOVFNFRL6OEdoM+pZH2+IwDQYJKoZIhvcNAQEEBQAwDzENMAsGA1UEAxMEVEJPRjAeFw0wNTA4MTQxMTM1NTJaFw0zOTEyMzEyMzU5NTlaMA8xDTALBgNVBAMTBFRCT0YwXDANBgkqhkiG9w0BAQEFAANLADBIAkEA4LmppsWXRtde8JpifUoEwrLRHfDwVXYbPxbWm3982W244gKz3/vGnasfJ+yPwGoGEFUoq2M1m6a4qoCOD3KxvwIDAQABo2YwZDANBgNVHQoEBjAEAwIGwDATBgNVHSUEDDAKBggrBgEFBQcDAzA+BgNVHQEENzA1gBBEI+0MSLutMEyQyJ747WJkoREwDzENMAsGA1UEAxMEVEJPRoIOVFNFRL6OEdoM+pZH2+IwDQYJKoZIhvcNAQEEBQADQQBBDFAiZIPfPLSxr6fJBKNcIr3uj997rPrpyRbHRJvC/56Wx+oNKazAVvyL2Xt23C8KadY01QbcB512LkF3Adxe"/>
</characteristic>
</characteristic>
</characteristic>
</wap-provisioningdoc>

將要寫入的憑証安裝檔準備好之後,接著要做寫入動作。

2.寫入憑証安裝檔到手機中
rapiconfig /p tbof.xml

寫入完成後,將手機重開機,你將可以在
HKLM\Comm\Security\SystemCertificates\Privileged Execution Trust Authorities\Certificates\
中找到自己的憑証內容,以我的為例,會找到這一組451b30370017237eae8aec08e47b6d855a7cb253
點進入後,可以在blob中看到你的.cer的內容,這時表示你的憑証檔已經寫入成特權憑証,以後以這組憑証簽名的所有程序,都將取得特權模式




如何將你漢化後的程序加上此特權簽名?

首先,完成你要漢化的程序(.exe 或.dll)

在COMMAND視窗中,輸入下列指令
signcode -v tbof.key -spc tbof.spc qptools.exe
輸入後,會要求輸入你建立憑証檔時的密碼,其中qptools.exe是我繁體化後的程序。

將此程序放回手機中,測試是否可以運行,OK。嘿嘿,我有了屬於自己的繁體化qptools了。
同理contacts menu等需特權模式才能運作的軟件亦有相同的問題,都可以此方法解決漢化後無法執行的問題。


附錄:
遇上注冊表軟件無法修改的鍵值時,如何刪除?如何建立.xml安裝檔?
經查找Microsoft的msdn後,終於找到答案。

http://msdn.microsoft.com/library/default.asp?url=/library/en-us/devguidesp/html/sp_wce51samregistrycspexamplesozup.asp

1.SDK Documentation for Windows Mobile-Based Smartphones

Adding a Key and Values, and Modifying a Value Example
This example adds a registry key (Registry\HKLM\Software\Microsoft\TestKey3), adds values to the key, and then modifies one of the values (TestValue).

<wap-provisioningdoc>
<characteristic type="Registry">
<characteristic type="HKLM\Software\Microsoft\TestKey3">
<parm name="TestValue" value="5" datatype="integer" />
<parm name="TestValueBoolean" value="1" datatype="boolean" />
<!-- boolean is stored as an integer in the registry -->
<parm name="TestValueFloat" value="3.14159" datatype="float" />
<!-- float is stored as a string in the registry -->
<parm name="TestValueString" value="testtesttest"
datatype="string" />
<parm name="TestValueDateTime1" value="10/20/01 3:55:04 pm"
datatype="date" />
<!-- date and time may be combined into a
single value using either date or time datatypes -->
<parm name="TestValueDateTime2" value="10/20/01 3:55:04 pm"
datatype="time" />
<parm name="TestValueString2"
value="string1string2string3" datatype="multiplestring" />
<!-- multiple strings are separated by  -->
<!-- multiple strings are ended with two  -->
<parm name="TestValueInteger"
value="5iAGkAbgBhAHIAeQAgAGIAbABvAGIA" datatype="binary" />
</characteristic>
</characteristic>
</wap-provisioningdoc>



2.SDK Documentation for Windows Mobile-Based Smartphones

Deleting a Key, Values and Subkeys Example
This example deletes a key (Registry\HKLM\Software\Microsoft\TestKey3), including the associated values and subkeys, from a registry.

<wap-provisioningdoc>
<characteristic type="Registry">
<nocharacteristic
type="HKLM\Software\Microsoft\TestKey3"/>
</characteristic>
</wap-provisioningdoc>



3.SDK Documentation for Windows Mobile-Based Smartphones

Deleting a Value Example
This example deletes a value (TestValue) from a registry key (Registry\HKLM\Software\Microsoft\TestKey3).


<wap-provisioningdoc>
<characteristic type="Registry">
<characteristic type="HKLM\Software\Microsoft\TestKey3">
<noparm name="TestValue" />
</characteristic>
</characteristic>
</wap-provisioningdoc>

透過這個.xml格式的注冊表安裝檔的建立及rapiconfig, 沒有刪不掉、建立不了的注冊表。
嘿,以前那些移除不了的程式清單也因此而乾乾淨淨, 算是另一個收獲。

以上內容,純為TBOF個人漢化研究使用,僅在IOICN漢化組發表。

呵,感謝qptools,因為這程序蠻好用的,但繁體化後一直無法使用,經研究其_setup.xml檔後,才開始這一連串的研究。
也感謝google上無盡的資源,讓我少走許多冤枉路。

文中很多不專業名辭,希望大家看得懂就好,報告完畢,敬請多多指教。
(這篇文章是2005年時,與一群漢化同好,在做國內外知名Smartphone軟體,簡繁體中文化時所撰寫。)

沒有留言: