9

Windows客户端EV证书代码签名踩坑

 1 year ago
source link: https://www.wyr.me/post/738
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

在现今的数字时代,软件安全日益受到重视。对于Windows客户端开发者来说,使用EV(Extended Validation)证书对软件进行代码签名是确保用户信任和防止恶意攻击的关键一环。本文将探讨在Windows下的桌面软件开发过程中进行EV证书代码签名的必要性,未签名可能存在的问题,以及在签名过程中可能遇到的问题和解决方法。

EV证书代码签名的必要性

EV证书代码签名能够保证用户在下载和安装软件时,能够确认软件的出处和完整性。通过签名,可以降低Windows操作系统对于软件的风险提示,提高用户的信任度。

未签名的软件在运行时,可能会受到Windows操作系统的风险提示。尤其在Windows 10以后的版本中,SmartScreen会对未签名的软件进行更严格的限制。用户在尝试安装或运行这类软件时,可能会看到来自Windows的警告信息,提示软件可能存在安全风险。这种情况会让用户对软件的安全性产生疑虑,降低软件的使用率。

签名过程中的问题和解决方法

在使用EV证书进行代码签名的过程中,可能会遇到一些问题,以下是两个主要的问题和相应的解决方法:

USB Key需要插入物理机

在购买EV证书后,证书供应商会提供一个物理USB Key,里面存放着证书信息。为了确保证书的安全性,需要将USB Key插入物理机来进行代码签名。然而,开发者在使用Windows远程桌面时,可能会发现无法正常加载Key中的证书。

SafeNet

例如GlobalSign使用的Token 5110 USB Key,在SafeNet软件提示如图“无令牌连接”,实际上右下角显示了USB设备弹出提示“弹出 Token JC”,设备管理器也正常显示了“智能卡读卡器”设备,但是软件始终无法识别到USB Key。

解决方法是,确保将USB Key插入到物理机上。如果必须使用远程桌面,在远程桌面设置中启用USB设备的本地资源共享。这样,在远程桌面中可以正常加载和使用USB Key中的证书。需要注意的是,这种方法可能会增加证书的安全风险,因此要确保远程连接的安全性。还有一种方法是,不要使用Windows默认的远程桌面工具,采用第三方的远程工具,但是这样也同样会增加安全风险。

Electron开发的程序进行代码签名需要签署编译过程中生成的所有文件

对于使用Electron框架开发的程序,在进行代码签名时,需要签署编译过程中生成的所有文件。这包括主程序、动态链接库(DLLs)以及其他相关资源文件。如果有任何一个文件未被签名,软件可能会受到Windows操作系统的风险提示。

解决方法是,在编译过程中确保对所有生成的文件进行签名。可以在Electron的构建配置文件中添加签名选项,以自动对生成的文件进行签名(electron-builder的配置文件中增加certificateSubjectName为证书名称,增加signDlls为ture)。同时,确保使用正确的EV证书和私钥信息,避免签名失败或被识别为无效签名。

注意:所有的密码都必须在密码输入提示框提示后15s之内输入完成。

中文证书在PowerShell签名需要配置正确的编码

在PowerShell对Windows客户端进行代码签名时,需要执行notepad $PROFILE编辑PowerShell配置文件,添加如下信息:

$OutputEncoding = [console]::InputEncoding = [console]::OutputEncoding = New-Object System.Text.UTF8Encoding

注意: 如果从未配置过PowerShell,需要先执行New-Item -Path $PROFILE -Type File -Force再使用notepad $PROFILE编辑PowerShell配置文件。

否则可能无法正常匹配到中文名称的EV代码签名证书。

执行Get-ChildItem -Recurse Cert: -CodeSigningCert可以查看当前的代码签名证书列表。

使用PowerShell签名需要注意PowerShell版本号

撰写本文的时候electron-builder最新版是v23.6.0,需要使用Win10自带的PowerShell的版本进行签名(执行$PSVersionTable得到版本信息):

Name                           Value
----                           -----
PSVersion                      5.1.19041.2673
PSEdition                      Desktop
PSCompatibleVersions           {1.0, 2.0, 3.0, 4.0...}
BuildVersion                   10.0.19041.2673
CLRVersion                     4.0.30319.42000
WSManStackVersion              3.0
PSRemotingProtocolVersion      2.3
SerializationVersion           1.1.0.1

经过测试,在最新跨平台PowerShell中无法正常签名:

Name                           Value
----                           -----
PSVersion                      7.3.3
PSEdition                      Core
GitCommitId                    7.3.3
OS                             Microsoft Windows 10.0.19045
Platform                       Win32NT
PSCompatibleVersions           {1.0, 2.0, 3.0, 4.0…}
PSRemotingProtocolVersion      2.3
SerializationVersion           1.1.0.1
WSManStackVersion              3.0

其他可能存在的问题

除了上述问题之外,开发者在进行EV证书代码签名的过程中还可能遇到以下问题:

  1. 证书过期:EV证书通常具有一定的有效期。在证书过期后,签名的软件可能会受到Windows操作系统的风险提示。因此,需要定期更新EV证书,确保其在有效期内。
  2. 证书供应商的信任度:不同的证书供应商在Windows操作系统中的信任度可能不同。选择一个知名且受信任的证书供应商,有助于提高签名软件的可信度。
  3. 签名工具的兼容性:使用不同版本的Windows操作系统和签名工具时,可能会遇到兼容性问题。确保使用适用于当前操作系统的签名工具,并关注工具的更新信息,避免因工具问题导致签名失败。
  4. 网络连接问题:在进行代码签名时,签名工具可能需要连接到证书供应商的服务器以完成时间戳服务。网络连接问题可能导致签名过程中断。确保在签名过程中具有稳定的网络连接,并考虑配置备用时间戳服务器,以提高签名成功率。

总之,对于Windows客户端开发者来说,进行EV证书代码签名是确保软件安全和提高用户信任度的关键。通过解决在签名过程中可能遇到的问题,开发者可以确保软件的签名有效,并为用户提供安全可靠的应用体验。在数字时代,保护用户的信息安全和隐私,是每一个开发者的责任和义务。


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK