Electron开发APP中U盾自动化数字签名
大白话系列之:Electron-builder的自动化数字签名!
现在Windows系统中, 如果app程序没有代码签名证书, 或者代码签名授信级别较低时, 系统同样会将其列为可信程序, 只是当用户运行该应用时, 系统会显示安全提示。没有签名是寸步难行了!
那么Electron开发的app程序怎么进行签名呢 ?这个必须去看下Electron-builder的文档。
electron-builder官网关于数字签名的文档:https://www.electron.build/code-signing.html
在开发E蜘蛛瀏覽器(EspiderBrowser)的实际遇到的需求, 需要解决。
对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
打包过程中, 让人瞠目结舌的事情出现了, u盾的密码验证窗口不停的弹出来才明白, 每个dll或者exe文件签名的时候, 都需要输入一次密码, 这…只能用自动输入了!
选择哪一种实现方法更好呢, 准备步骤如下: 1、用c实现进程查找窗口句柄查找并实现功能。又要翻一遍api了, 先等等。 2、用python3来实现。哇, 这个快, 上代码, sign.py代码如下:
1import os 2import time 3import win32gui 4import win32api 5import win32con 6 7def click(hwd): 8 win32gui.PostMessage(hwd, win32con.WM_LBUTTONDOWN, win32con.MK_LBUTTON, 0) 9 win32gui.PostMessage(hwd, win32con.WM_LBUTTONUP, win32con.MK_LBUTTON, 0) 10 11def SetText(hwd, text): 12 win32api.SendMessage(hwd,win32con.WM_SETTEXT,None, text) 13 14def getText(hwd): 15 buffer = '0' *50 16 len = win32gui.SendMessage(hwd, win32con.WM_GETTEXTLENGTH)+1 #获取edit控件文本长度 17 win32gui.SendMessage(hwd, win32con.WM_GETTEXT, len, buffer) #读取文本 18 print("getText:",len,buffer[:len-1]) 19 20def proc(spwd): 21 print('----proc start----') 22 a = win32gui.FindWindow("#32770","设备登录") 23 if a > 0: 24 pwd = win32gui.FindWindowEx(a, None, 'Edit', None) 25 btn = win32gui.FindWindowEx(a, None, 'Button', None) 26 bsetpwd = False 27 if pwd>0: 28 #print("pwd:",pwd) 29 pwd2 = win32gui.FindWindowEx(a, pwd, 'Edit', None) 30 if pwd2>0: 31 print("send password:",pwd2) 32 SetText(pwd2,spwd) 33 bsetpwd = True 34 time.sleep(0.2) 35 if bsetpwd and btn>0: 36 #print("btn:",btn) 37 text = win32gui.GetWindowText(btn) 38 if text == "确定": 39 print("send click:",btn) 40 click(btn) 41 #loginid = win32gui.GetWindowPlacement(a) 42 else: 43 print('Error:没有发现窗口') 44 45if __name__ == "__main__": 46 while True: 47 proc("u盾密码") 48 time.sleep(1) 49
3、当然涉及窗口定位需要用到spy++。这个在Visual Studio中自带了, 没有的可以在网上下载一个
4、在运行yarn compile-win32开始编译打包以后, 运行python3 sign.py, 就全自动签名了。
E蜘蛛瀏覽器(EspiderBrowser)使用的如上方案解决, 解放了双手。