2013-08-17 50 views
16

我準備了一個應用程序和網站,客戶可以在下載之前爲其設置多個選項。設置以二進制格式存儲在文件末尾(附加),然後編輯後的文件發送給最終用戶。問題在於文件「內容」的更改會破壞文件簽名 - 是否有機會使用任何命令行工具重新簽署此更改的文件?我試圖使用微軟的SignTool,但它在Linux上無法正常工作。在基於Linux的發行版上籤署Windows應用程序

回答

15

它實際上是quite straight forward使用Mono的signtool;棘手的部分(在鏈接的Mozilla文章中有更詳細的描述)將以正確的格式將證書從Windows複製到Linux。

將Windows PFX證書文件轉換爲PVK和SPC文件只需在將證書從Windows複製到Linux時執行一次;

openssl pkcs12 -in authenticode.pfx -nocerts -nodes -out key.pem 
openssl rsa -in key.pem -outform PVK -pvk-strong -out authenticode.pvk 
openssl pkcs12 -in authenticode.pfx -nokeys -nodes -out cert.pem 
openssl crl2pkcs7 -nocrl -certfile cert.pem -outform DER -out authenticode.spc 

實際上對exe的簽名是直截了當的;

signcode \ 
-spc authenticode.spc \ 
-v authenticode.pvk \ 
-a sha1 -$ commercial \ 
-n My\ Application \ 
-i http://www.example.com/ \ 
-t http://timestamp.verisign.com/scripts/timstamp.dll \ 
-tr 10 \ 
MyApp.exe 
+0

你有使用這個工具的個人經驗嗎?您提到的那篇文章是[超過2年](https://developer.mozilla.org/en-US/docs/Signing_an_executable_with_Authenticode$history),所以有些保證它仍然是最新的會很好。 –

+0

@RobW我已經使用Mono 3.2.5使用該命令簽署了可執行文件,它運行良好(實際上我只是測試過)。我現在無法測試從Windows導出證書的確切步驟,因爲我不在Mac上,但我知道給出的流程與我最近使用的非常相似。 –

+0

感謝您的確認!不要擔心證書,OpenSSL能夠將任何東西轉換爲任何東西。 –

15

您可以嘗試osslsigncode

要註冊的EXE或MSI文件,你現在可以做的:

osslsigncode sign -certs <cert-file> -key <der-key-file> \ 
     -n "Your Application" -i http://www.yourwebsite.com/ \ 
     -in yourapp.exe -out yourapp-signed.exe 

,或者如果您使用的是PEM或PVK密鑰文件用密碼 帶PEM證書:

osslsigncode sign -certs <cert-file> \ 
     -key <key-file> -pass <key-password> \ 
     -n "Your Application" -i http://www.yourwebsite.com/ \ 
     -in yourapp.exe -out yourapp-signed.exe 

,或者如果你想添加一個時間戳,以及:

osslsigncode sign -certs <cert-file> -key <key-file> \ 
     -n "Your Application" -i http://www.yourwebsite.com/ \ 
     -t http://timestamp.verisign.com/scripts/timstamp.dll \ 
     -in yourapp.exe -out yourapp-signed.exe 

您可以使用存儲在PKCS#12容器中的證書和密鑰:

osslsigncode sign -pkcs12 <pkcs12-file> -pass <pkcs12-password> \ 
     -n "Your Application" -i http://www.yourwebsite.com/ \ 
     -in yourapp.exe -out yourapp-signed.exe 

要登錄一個包含java類文件的CAB文件:

osslsigncode sign -certs <cert-file> -key <key-file> \ 
     -n "Your Application" -i http://www.yourwebsite.com/ \ 
     -jp low \ 
     -in yourapp.cab -out yourapp-signed.cab 
+0

這是爲我工作的解決方案。 signcode工具沒有簽名文件(雖然它報告簽名成功) – treaz

+0

這對於在Mageia Linux下用NSIS和Ant簽名我的Windows安裝程序(包裝Java軟件)很有用。非常感謝:) – gouessej

+0

我很高興我找到了這個偉大的解決方案!我實際上想在Windows中使用微軟的signtool.exe來簽署我的代碼,所以我在閱讀你的答案後在Windows上的Ubuntu上使用了Bash。如果其他人在同一條船上,這裏是簡要說明https://blog.synapp.nz/2017/06/16/code-signing-a-windows-application-on-linux-on-windows/ –

相關問題