小案例系列之:Electron-builder的自动化数字签名!
现在Windows系统中,如果app程序没有代码签名证书,或者代码签名授信级别较低时,系统同样会将其列为可信程序,只是当用户运行该应用时,系统会显示安全提示。没有签名是寸步难行了!
那么Electron开发的app程序怎么进行签名呢 ?这个必须去看下Electron-builder的文档。
electron-builder官网关于数字签名的文档:Code Signing – electron-builder
在开发蜂巢指纹浏览器(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
打包过程中,让人瞠目结舌的事情出现了,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)使用的如上方案解决,解放了双手。