5 minutes read

Electron开发APP中U盾自动化数字签名


Fire bug
13/11/2022 2:42 AM

大白话系列之:Electron-builder的自动化数字签名!

现在Windows系统中, 如果app程序没有代码签名证书, 或者代码签名授信级别较低时, 系统同样会将其列为可信程序, 只是当用户运行该应用时, 系统会显示安全提示。没有签名是寸步难行了!

那么Electron开发的app程序怎么进行签名呢 ?这个必须去看下Electron-builder的文档。

electron-builder官网关于数字签名的文档:https://www.electron.build/code-signing.html

在开发蜂巢指纹浏览器(NestBrowser)的实际遇到的需求, 需要解决。

对APP数字签名的需求:

1、多app下的所有dll和exe文件都进行数字签名

当前国内的数字证书发行机构一般都是提供U盾, 不会单独提供PFX证书文件。这是考虑到安全性和唯一性, 使用硬件设备限制了根证书文件的唯一性。electron-builder使用U盾签名的配置electron-builder.json如下:

这个certificateSubjectName怎么获取呢?

1、插入数字签名u盾:

2、在powsershell中运行如下命令:[这个命令找的相当辛苦, 查看electron-builder源码才找到]

Get-ChildItem -Recurse Cert: -CodeSigningCert | Select-Object -Property Subject,PSParentPath,Thumbprint | ConvertTo-Json -Compress

以上命令来自:https://github.com/electron-userland/electron-builder/blob/5668dc204b83ae0c1edf79a4998f41292007d230/packages/app-builder-lib/src/codeSign/windowsCodeSign.ts

打包过程中, 让人瞠目结舌的事情出现了, u盾的密码验证窗口不停的弹出来才明白, 每个dll或者exe文件签名的时候, 都需要输入一次密码, 这…只能用自动输入了!

选择哪一种实现方法更好呢, 准备步骤如下: 1、用c实现进程查找窗口句柄查找并实现功能。又要翻一遍api了, 先等等。 2、用python3来实现。哇, 这个快, 上代码, sign.py代码如下:

import os
import time
import win32gui
import win32api
import win32con
def click(hwd):
win32gui.PostMessage(hwd, win32con.WM_LBUTTONDOWN, win32con.MK_LBUTTON, 0)
win32gui.PostMessage(hwd, win32con.WM_LBUTTONUP, win32con.MK_LBUTTON, 0)
def SetText(hwd, text):
win32api.SendMessage(hwd,win32con.WM_SETTEXT,None, text)
def getText(hwd):
buffer = '0' *50
len = win32gui.SendMessage(hwd, win32con.WM_GETTEXTLENGTH)+1 #获取edit控件文本长度
win32gui.SendMessage(hwd, win32con.WM_GETTEXT, len, buffer) #读取文本
print("getText:",len,buffer[:len-1])
def proc(spwd):
print('----proc start----')
a = win32gui.FindWindow("#32770","设备登录")
if a > 0:
pwd = win32gui.FindWindowEx(a, None, 'Edit', None)
btn = win32gui.FindWindowEx(a, None, 'Button', None)
bsetpwd = False
if pwd>0:
#print("pwd:",pwd)
pwd2 = win32gui.FindWindowEx(a, pwd, 'Edit', None)
if pwd2>0:
print("send password:",pwd2)
SetText(pwd2,spwd)
bsetpwd = True
time.sleep(0.2)
if bsetpwd and btn>0:
#print("btn:",btn)
text = win32gui.GetWindowText(btn)
if text == "确定":
print("send click:",btn)
click(btn)
#loginid = win32gui.GetWindowPlacement(a)
else:
print('Error:没有发现窗口')
if __name__ == "__main__":
while True:
proc("u盾密码")
time.sleep(1)

3、当然涉及窗口定位需要用到spy++。这个在Visual Studio中自带了, 没有的可以在网上下载一个

4、在运行yarn compile-win32开始编译打包以后, 运行python3 sign.py, 就全自动签名了。

蜂巢指纹浏览器(NestBrowser)使用的如上方案解决, 解放了双手。


Fire bug

Leader

Nestbrowser(蜂巢浏览器) 可自定义所有参数来隐藏和控制您的数字指纹。您可以模仿真实的 Internet 身份。 Nestbrowser 帮助您创建大量配置文件, 每个配置文件都有自己的数字指纹。这些配置文件彼此不重叠, 因此网站不会禁止您的帐户。这对于执行各种任务非常有用在网上。

Member since Mar 15, 2021


最近文章

React-dnd 实现无限子集的拖拽构建功能(多层嵌套)
15 Jul 202314 minutes read
查看所有文章