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

小案例系列之: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

以上命令来自:electron-builder/windowsCodeSign.ts at 5668dc204b83ae0c1edf79a4998f41292007d230 · electron-userland/electron-builder · GitHub

​打包过程中,让人瞠目结舌的事情出现了,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)使用的如上方案解决,解放了双手。

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值