在基于 Linux 的发行版上对 Windows 应用程序进行签名
- 2024-11-08 08:44:00
- admin 原创
- 52
问题描述:
我准备了一个应用程序和网站,客户可以在下载之前设置此应用程序的几个选项。设置以二进制格式存储在文件末尾(附加),然后将编辑后的文件发送给最终用户。问题是文件“内容”的更改会破坏文件签名 - 是否有机会使用任何命令行工具重新签名此更改的文件?我尝试使用 Microsoft 的 SignTool,但它在 Linux 上无法正常工作。
解决方案 1:
你可以尝试osslsigncode
要签署 EXE 或 MSI 文件,您现在可以执行以下操作:
osslsigncode sign -certs <cert-file> -key <der-key-file> \n -n "Your Application" -i http://www.yourwebsite.com/ \n -in yourapp.exe -out yourapp-signed.exe
或者如果您使用带有密码的 PEM 或 PVK 密钥文件以及 PEM 证书:
osslsigncode sign -certs <cert-file> \n -key <key-file> -pass <key-password> \n -n "Your Application" -i http://www.yourwebsite.com/ \n -in yourapp.exe -out yourapp-signed.exe
或者如果您还想添加时间戳:
osslsigncode sign -certs <cert-file> -key <key-file> \n -n "Your Application" -i http://www.yourwebsite.com/ \n -t http://timestamp.verisign.com/scripts/timstamp.dll \n -in yourapp.exe -out yourapp-signed.exe
您可以使用存储在 PKCS#12 容器中的证书和密钥:
osslsigncode sign -pkcs12 <pkcs12-file> -pass <pkcs12-password> \n -n "Your Application" -i http://www.yourwebsite.com/ \n -in yourapp.exe -out yourapp-signed.exe
要对包含 Java 类文件的 CAB 文件进行签名:
osslsigncode sign -certs <cert-file> -key <key-file> \n -n "Your Application" -i http://www.yourwebsite.com/ \n -jp low \n -in yourapp.cab -out yourapp-signed.cab
解决方案 2:
使用 signtool 来完成这项工作实际上非常简单Mono
;棘手的部分(在链接的 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 \n -spc authenticode.spc \n -v authenticode.pvk \n -a sha1 -$ commercial \n -n My Application \n -i http://www.example.com/ \n -t http://timestamp.digicert.com/scripts/timstamp.dll \n -tr 10 \n MyApp.exe
解决方案 3:
如果您想在运行时以编程方式执行此操作,则可以使用Jsign工具。特别是当您通过请求签名在后端生成可自执行的存档时,它会非常有用。显然,您可以使用 Java/Kotlin 来执行此操作(该工具的名称暗示了这一点)。这是官方网站提供的 API:
只需将此依赖项添加到项目中:
<dependency> <groupId>net.jsign</groupId> <artifactId>jsign-core</artifactId> <version>3.1</version> </dependency>
然后
AuthenticodeSigner
像这样使用该类:KeyStore keystore = KeyStoreUtils.load(newFile("keystore.p12"), "PKCS12", "password", null); AuthenticodeSigner signer = new AuthenticodeSigner(keystore, "test", "secret"); signer.withProgramName("My Application") .withProgramURL("http://www.example.com") .withTimestamping(true) .withTimestampingAuthority("http://timestamp.comodoca.com/authenticode"); Signable file = Signable.of(new File("application.exe")); signer.sign(file);
有关 API 的更多详细信息,请参阅Javadoc 。
除了通过 Java 签名KeyStore
AuthenticodeSigner
有(Certificate, PrivateKey)
构造函数之外,您可以像我在“Spring on Kotlin”后端中一样自由使用它:
@Bean
fun certsChain(): Array<Certificate> {
val fact: CertificateFactory = CertificateFactory.getInstance("X.509")
val `is` = ResourceUtil.getResourceFileAsInputStream("cert/certificate.pem")
val cer: X509Certificate = fact.generateCertificate(`is`) as X509Certificate
return arrayOf(cer)
}
@Bean
fun privateKey(): PrivateKey {
var key = ResourceUtil.getResourceFileAsString("cert/privateKey.pem")
key = key.replace("-----BEGIN PRIVATE KEY-----", "")
key = key.replace("
", "")
key = key.replace("-----END PRIVATE KEY-----", "")
val encoded = Base64.getDecoder().decode(key)
val kf = KeyFactory.getInstance("RSA")
val keySpec = PKCS8EncodedKeySpec(encoded)
return kf.generatePrivate(keySpec) as RSAPrivateKey
}
@Bean
fun signer(
certs: Array<Certificate>,
privateKey: PrivateKey
): AuthenticodeSigner =
AuthenticodeSigner(certs, privateKey)
.withProgramName("Your Company Name")
.withProgramURL("https://something.com")
.withTimestamping(true)
.withTimestampingAuthority("http://timestamp.comodoca.com/authenticode");
之后,你可以直接使用@Autowire
bean并使用所需文件signer
调用其方法sign()
- 2024年20款好用的项目管理软件推荐,项目管理提效的20个工具和技巧
- 2024年开源项目管理软件有哪些?推荐5款好用的项目管理工具
- 项目管理软件有哪些?推荐7款超好用的项目管理工具
- 项目管理软件哪个最好用?盘点推荐5款好用的项目管理工具
- 项目管理软件有哪些最好用?推荐6款好用的项目管理工具
- 2024年常用的项目管理软件有哪些?推荐这10款国内外好用的项目管理工具
- 项目管理软件有哪些,盘点推荐国内外超好用的7款项目管理工具
- 2024项目管理软件排行榜(10类常用的项目管理工具全推荐)
- 项目管理软件排行榜:2024年项目经理必备5款开源项目管理软件汇总
- 项目管理必备:盘点2024年13款好用的项目管理软件