.dll 上出现“无法验证发布者”

.dll 上出现“无法验证发布者”

我的一个 .dll 文件未签名,每次运行使用该文件的程序时,都会弹出此警告:

弹出窗口

我尝试编辑以下注册表项以同时包含.exe.dll文件HKCU\Software\Microsoft\Windows\CurrentVersion\Policies\Associations\LowRiskFileTypes,但它仍然给我警告。我该如何摆脱它?我不介意是否必须全局禁用警告或其他什么,我只是厌倦了看到它。需要明确的是,这个文件不在网络共享或任何东西上——它只是在我的硬盘上。

顺便说一下,我正在运行 Windows 10 Home 的最新版本(不是 Insider)。

答案1

最简单的解决方案是创建一个自签名 CA(C证书A授权),使用它来签署代码签名证书,然后该证书签署BPSRegWD64.dll (假设你 100% 信任该库)


用于openssl创建 CA 和代码签名证书,然后SignTool.exe签署BPSRegWD64.dll

  1. 安装OpenVPN,确保C:\Program Files\OpenVPN\bin已添加到系统PATH
    OpenSSL 不会创建 Windows 二进制文件,因此安装捆绑的软件更简单

  2. 下载openssl.cnf创建所需证书KU 和 EKU 信息
    另存为%UserProfile%\Documents\SSL\openssl.cnf;要求命令/信息从第 430 行开始

    1. 通过 PowerShell 终端为 OpenSSL 创建所需的目录和文件:
      WinKey+R>打开: Powershell> 确定

      # Create PowerShell variable for $docs:
        $docs = [Environment]::GetFolderPath("MyDocuments")
      
      # Create OpenSSL Directories
        MkDir "$docs\SSL\ca"
        MkDir "$docs\SSL\cert"
        MkDir "$docs\SSL\crl"
        MkDir "$docs\SSL\csr"
        MkDir "$docs\SSL\key"
        MkDir "$docs\SSL\p12"
      
      # Create File: crlnumber
        Echo 01 > "$docs\SSL\crl\crlnumber"
      
      # Create File: index
        Echo > "$docs\SSL\index"
      
      # Create File: rand
        Echo > "$docs\SSL\rand"
      
      # Create File: serial
        Echo 00 > "$docs\SSL\serial"
      
      # Enter SSL Directory
        Cd "$docs\SSL"
      
    2. 生成自签名CA:

      OpenSSL req -x509 -new -sha512 -days 3650 -newkey rsa:4096 -keyout ".\ca\CA.key.pem" -out ".\ca\CA.crt.pem" -config ".\openssl.cnf" -extensions v3_signing_ica
      

      CA 密钥应具有安全密码至少20个字符,至少包含:
      2个大写字母、2个小写字母、2个数字和2个符号

    3. 生成 CSR (C证书年代点火R马术)获取签名证书:
      修改openssl.cnf244行()email.1 = [email protected]使用用户的电子邮件,然后:

      OpenSSL req -out ".\csr\Signing.csr" -new -days 3650 -sha512 -newkey rsa:2048 -keyout ".\key\Signing.key.pem" -config ".\openssl.cnf" -extensions v3_codesign
      

      证书密钥应具有安全密码至少16 个字符内联#2.2

    4. 使用 CA 签署签名证书:

      OpenSSL x509 -req -sha512 -days 3650 -in ".\csr\Signing.csr" -CA ".\ca\CA.crt.pem" -CAkey ".\ca\CA.key.pem" -CAserial .\serial -out ".\cert\Signing.crt.pem" -extfile ".\openssl.cnf" -extensions v3_codesign
      
    5. 将签名证书导出为 PKCS12 证书:

      OpenSSL pkcs12 -export -out ".\p12\Signing.p12" -inkey ".\key\Signing.key.pem" -in ".\cert\Signing.crt.pem" -certfile ".\ca\CA.crt.pem"
      

      PKCS12 应该有一个安全密码至少16 个字符内联#2.2

  3. 将证书导入证书管理器(certmgr.msc):

    1. 将扩展注册.pem为有效证书:
      通过以下方式打开管理终端:WinKey+R>打开: Powershell>CTRL+SHIFT> 确定

      Reg ADD "HKCR\.pem" /T REG_SZ /d CERfile ; Reg ADD "HKCR\.pem" /V "Content Type" /T REG_SZ /D application/x-x509-ca-cert ; Pause ; Exit
      
    2. 导入 CA 作为受信任的根证书颁发机构
      右键单击CA.crt.pem> 安装证书 > 本地计算机 > 下一步 > 批准 UAC >
      将所有证书放入以下存储中> 浏览... >受信任的根证书颁发机构
      确定 > 下一步 > 完成
    3. 导入 PKCS12 作为 个人证书
      右击Signing.p12> 安装 PFX > 当前用户 > 下一步 >文件名:
      %UserProfile%\Documents\SSL\p12\Signing.p12> 下一步 > 输入密码 > 下一步 > 确定

  4. 通过以下方式签名BPSRegWD64.dll

    1. Set-AuthenticodeSignature

      1. 创建Sign.ps1脚本:

        Cmd /C Echo '#
        
                ##::[[---  PowerShell Signing Script  ---]]::##
        
            # Paramaters #
        #----------------------------------------------------------------
        
        # Error if no file is specified:
          param([string] $file=$(throw "Please specify a script filepath."))
        
        # Auto select user signing certificate:
          $Cert = Get-ChildItem -Path "Cert:\CurrentUser\My" -CodeSigningCert
        
        # SHA256 TimeStamp server:
          $timeStampURL = "http://sha256timestamp.ws.symantec.com/sha256/timestamp"
        
        
            # Script #
        #----------------------------------------------------------------
        if($cert) {
            Set-AuthenticodeSignature -filepath $file -Certificate $Cert -HashAlgorithm SHA256 -TimestampServer $timeStampURL
        }
        else {
            throw "Did not find certificate with friendly name of `"$certFriendlyName`""
        }' > "C:\Sign.ps1"
        
      2. 执行Sign.ps1

        C:\Sign.ps1 "C:\Path\to\BPSRegWD64.dll"
        


    2. SignTool.exe

      1. 安装Windows SDK桌面应用程序签名工具
        确保路径SignTool.exe已添加到系统PATH
        • Control Panel\All Control Panel Items\System> 高级系统设置 >
          环境变量 > 系统变量 > 路径 > 编辑 > 新建 >signtool.exe路径 >
          确定 > 确定 > 确定
          示例路径:C:\Program Files (x86)\Windows Kits\10\bin\10.0.18362.0\x64

          PowerShellSet-AuthenticodeSignature可以签名某些文件扩展名,但SignTool不能,反之亦然,但我不确定哪些文件可以签名,哪些文件不能签名,因此最好也安装 SDK 的SignTool
      2. 执行SignTool.exe

        SignTool Sign /S My /FD SHA256 /TD SHA256 /TR "http://sha256timestamp.ws.symantec.com/sha256/timestamp" "C:\Path\to\BPSRegWD64.dll"
        

相关内容