Electron 将 x509 证书导入本地钥匙串 (macOS) - 由于无法进行用户交互,因此授权被拒绝 问题:我们的工作:更新更新 2更新 3更新 4我要如何测试?

如何解决Electron 将 x509 证书导入本地钥匙串 (macOS) - 由于无法进行用户交互,因此授权被拒绝 问题:我们的工作:更新更新 2更新 3更新 4我要如何测试?

我想将证书 (x509) 导入本地密钥库(win 和 macOS)。使用此电子应用程序,用户可以在本地创建网站并启用 HTTPS,这就是我们需要存储证书的原因。

问题:

在极少数情况下,用户在导入证书期间收到错误消息仅在 macOS 上

命令失败:security add-trusted-cert -d -r trustRoot -k /Library/Keychains/System.keychain /Users/user/ssl/asdasd.local.crt SecTrustSettingsSetTrustSettings:授权被拒绝,因为 无法进行用户交互。

如果用户在终端中使用 sudo 运行完全相同的命令,它会按预期工作。

注意:所有收到此错误消息的用户都启用了 Apple Watch 身份验证,但我们知道也启用了 Apple Watch 身份验证的用户没有收到错误消息。

我们的工作:

在电子渲染器进程中,我们使用 sudo-prompt npm 包运行以下命令。每次我们首先从密钥库中删除证书(如果它确实存在)并添加新证书。

Windows 添加证书:

certutil -addstore -f ROOT C:\Users\user\ssl\asdasd.local.crt

Windows 删除证书:

certutil -delstore ROOT asdasd.local

ma​​cOS 添加证书:

security add-trusted-cert -d -r trustRoot -k /Library/Keychains/System.keychain /Users/user/ssl/asdasd.local.crt

ma​​cOS 删除证书:

security delete-certificate -c asdasd.local

更新

我在 sudo-prompt 存储库中打开了一个问题:https://github.com/jorangreef/sudo-prompt/issues/137

M1 mac 要求密码两次。

更新 2

我刚刚意识到这个问题与 M1 无关。可能与 Big Sur 11.1 相关。

看起来 sudo-prompt 包隐藏了第二个密码对话框。

更新 3

该命令将证书存储在钥匙串中,但如果发生错误,信任值不是“始终信任”。

更新 4

我已经尝试过 osascript 方式。它在 Big Sur 11.0 上运行良好,但在 M1 Big Sur 11.1 上出现相同的错误。 (附截图)

enter image description here

我要如何测试?

运行以下命令:

const sudo = require('sudo-prompt')

sudo.exec(
  'security add-trusted-cert -d -r trustRoot -k /Library/Keychains/System.keychain /Users/kotapeter/ssl/test.local.crt',{
    name: 'test',},(error,stdout) => {
    if (error) {
      console.log(error)
    } else {
      console.log(stdout)
    }
  }
)

我们使用以下证书格式:

enter image description here

解决方法

我建议使用如下方法,它会自动通过 GUI 请求管理员访问

const { exec } = require('child_process');

const proc = exec('osascript -e \'do shell script "pwd" with administrator privileges\'',function (error,stdout,stderr) {
    if (error) {
      console.log(error.stack);
      console.log('Error code: '+error.code);
      console.log('Signal received: '+error.signal);
    }
    console.log('Child Process STDOUT: '+stdout);
    console.log('Child Process STDERR: '+stderr);
  });
  
  proc.on('exit',function (code) {
    console.log('Child process exited with exit code '+code);
  });

Admin access

Output

这是在 MacOS Big Sur 11.1

更新21 年 1 月 23 日

您可以构建自己的可执行文件并从 NodeJS 运行它

//
//  main.swift
//  AddCert
//
//  Created by Tarun Lalwani on 23/01/21.
//

import Foundation

import Security

let certInfo: CFDictionary

enum SecurityError:Error {
    case generalError
}

func deleteCertificateFromKeyChain(_ certificateLabel:String) -> Bool{
    
    let delQuery : [NSString:Any] = [
        kSecClass: kSecClassCertificate,kSecAttrLabel: certificateLabel,]
    let delStatus:OSStatus = SecItemDelete(delQuery as CFDictionary)
    
    return delStatus == errSecSuccess
    
}

func saveCertificateToKeyChain(_ certificate:SecCertificate,certificateLabel:String) throws {
    deleteCertificateFromKeyChain(certificateLabel)

    let setQuery: [NSString: AnyObject] = [
        kSecClass: kSecClassCertificate,kSecValueRef: certificate,kSecAttrLabel: certificateLabel as AnyObject,kSecAttrAccessible: kSecAttrAccessibleWhenUnlockedThisDeviceOnly,]
    let addStatus:OSStatus = SecItemAdd(setQuery as CFDictionary,nil)
    
    
    guard addStatus == errSecSuccess else {
        throw SecurityError.generalError
    }
    
    var status = SecTrustSettingsSetTrustSettings(certificate,SecTrustSettingsDomain.admin,nil)
    
}

func getCertificateFromString(stringData:String) throws -> SecCertificate{
    
    if let data:NSData = NSData(base64Encoded: stringData,options: NSData.Base64DecodingOptions.ignoreUnknownCharacters)  {
        if let certificate = SecCertificateCreateWithData(kCFAllocatorDefault,data) {
            return certificate
        }
    }
    throw SecurityError.generalError
}

var certificateString:String = "MIIDUzCCAjugAwIBAgIUD9xMnL73y7fuida5TXgmklLswsowDQYJKoZIhvcNAQELBQAwGTEXMBUGA1UEAwwOdGVzdHNpdGUubG9jYWwwHhcNMjEwMTE3MTExODU1WhcNNDEwMTEyMTExODU1WjAZMRcwFQYDVQQDDA50ZXN0c2l0ZS5sb2NhbDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANM08SDi06dvnyU1A6//BeEFd8mXsOpDQCbYEHX/Pz4jqaBYwVjD5pG7FkvDeUKZnEVyrsofjZ4Y1WAT8jxPMUi+jDlgNTiFjPVc4rA6hcGX6b70HjsCACmc8bZd+EU7gm4b5eL6exTsVzHc+lFz4eQFXgutYTL7guDQE/gFHwqPkLvnfg3rgY31p3Hm/snL8NuD154iE9O1WuSxEjik65uOQaewZmJ9ejJEuuEhMA8O9dXveJ71TMV5lqA//svDxBu3zXIxMqRy2LdzfROd+guLP6ZD3jUycWi7GpF4yN0+rD/0aXFJVHzV6TpS9oqb14jynvn1AyVfBB9+VQVNwTsCAwEAAaOBkjCBjzAJBgNVHRMEAjAAMAsGA1UdDwQEAwIC9DA7BgNVHSUENDAyBggrBgEFBQcDAQYIKwYBBQUHAwIGCCsGAQUFBwMDBggrBgEFBQcDBAYIKwYBBQUHAwgwHQYDVR0OBBYEFDjAC2ObSbB59XyLW1YaD7bgY8ddMBkGA1UdEQQSMBCCDnRlc3RzaXRlLmxvY2FsMA0GCSqGSIb3DQEBCwUAA4IBAQBsU6OA4LrXQIZDXSIZPsDhtA7YZWzbrpqPceXPwBd1k9Yd9T83EdA00N6eoOWFzwnQqwqKxtYdl3x9JQ7ewhY2huH9DRtCGjiTm/GVU/WnNm4tUTuGU4FyjSTRi8bNUxTSF5PZ0U2/vFZ0d7T43NbLQAiFSxyfC1r6qjKQCYDL92XeU61zJxesxy5hxVNrbDpbPnCUZpx4hhL0RHgG+tZBOlBuW4eq249O0Ql+3ShcPom4hzfh975385bfwfUT2s/ovng67IuM9bLSWWe7U+6HbOEvzMIiqK94YYPmOC62cdhOaZIJmro6lL7eFLqlYfLU4H52ICuntBxvOx0UBExn"


let certificate = try! getCertificateFromString(stringData: certificateString)


try? saveCertificateToKeyChain(certificate,certificateLabel: "Test")

在上面的例子中,我没有使用证书文件,但你可以更新代码来使用它,你也可以使用命令行参数来获取文件路径

感谢以下文件使此代码正常工作

https://github.com/ibm-bluemix-mobile-services/bms-clientsdk-swift-security/blob/c26988a7f5de338c1d9e0d43a64c2b6db33be541/Source/mca/internal/certificate/SecurityUtils.swift

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


依赖报错 idea导入项目后依赖报错,解决方案:https://blog.csdn.net/weixin_42420249/article/details/81191861 依赖版本报错:更换其他版本 无法下载依赖可参考:https://blog.csdn.net/weixin_42628809/a
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下 2021-12-03 13:33:33.927 ERROR 7228 [ main] o.s.b.d.LoggingFailureAnalysisReporter : *************************** APPL
错误1:gradle项目控制台输出为乱码 # 解决方案:https://blog.csdn.net/weixin_43501566/article/details/112482302 # 在gradle-wrapper.properties 添加以下内容 org.gradle.jvmargs=-Df
错误还原:在查询的过程中,传入的workType为0时,该条件不起作用 <select id="xxx"> SELECT di.id, di.name, di.work_type, di.updated... <where> <if test=&qu
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct redisServer’没有名为‘server_cpulist’的成员 redisSetCpuAffinity(server.server_cpulist); ^ server.c: 在函数‘hasActiveC
解决方案1 1、改项目中.idea/workspace.xml配置文件,增加dynamic.classpath参数 2、搜索PropertiesComponent,添加如下 <property name="dynamic.classpath" value="tru
删除根组件app.vue中的默认代码后报错:Module Error (from ./node_modules/eslint-loader/index.js): 解决方案:关闭ESlint代码检测,在项目根目录创建vue.config.js,在文件中添加 module.exports = { lin
查看spark默认的python版本 [root@master day27]# pyspark /home/software/spark-2.3.4-bin-hadoop2.7/conf/spark-env.sh: line 2: /usr/local/hadoop/bin/hadoop: No s
使用本地python环境可以成功执行 import pandas as pd import matplotlib.pyplot as plt # 设置字体 plt.rcParams['font.sans-serif'] = ['SimHei'] # 能正确显示负号 p
错误1:Request method ‘DELETE‘ not supported 错误还原:controller层有一个接口,访问该接口时报错:Request method ‘DELETE‘ not supported 错误原因:没有接收到前端传入的参数,修改为如下 参考 错误2:cannot r
错误1:启动docker镜像时报错:Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen 解决方法:重启docker -> systemctl r
错误1:private field ‘xxx‘ is never assigned 按Altʾnter快捷键,选择第2项 参考:https://blog.csdn.net/shi_hong_fei_hei/article/details/88814070 错误2:启动时报错,不能找到主启动类 #
报错如下,通过源不能下载,最后警告pip需升级版本 Requirement already satisfied: pip in c:\users\ychen\appdata\local\programs\python\python310\lib\site-packages (22.0.4) Coll
错误1:maven打包报错 错误还原:使用maven打包项目时报错如下 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources)
错误1:服务调用时报错 服务消费者模块assess通过openFeign调用服务提供者模块hires 如下为服务提供者模块hires的控制层接口 @RestController @RequestMapping("/hires") public class FeignControl
错误1:运行项目后报如下错误 解决方案 报错2:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project sb 解决方案:在pom.
参考 错误原因 过滤器或拦截器在生效时,redisTemplate还没有注入 解决方案:在注入容器时就生效 @Component //项目运行时就注入Spring容器 public class RedisBean { @Resource private RedisTemplate<String
使用vite构建项目报错 C:\Users\ychen\work>npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-