我正在编写Security framework crate的更新,这是对Apple Security.framework的绑定.

我添加了一些功能,如SecCertificateAddToKeychain,没有任何问题,但使用SecTrustSettingsSetTrustSettings,结果总是 -2070 errSecInternalComponent .

以下是完整的实施:

use crate::base::SecCertificateRef;
use core_foundation_sys::array::CFArrayRef;
use core_foundation_sys::base::CFTypeRef;
use core_foundation_sys::base::OSStatus;

pub type SecTrustSettingsDomain = u32;

pub const kSecTrustSettingsDomainUser: SecTrustSettingsDomain = 0;
pub const kSecTrustSettingsDomainAdmin: SecTrustSettingsDomain = 1;
pub const kSecTrustSettingsDomainSystem: SecTrustSettingsDomain = 2;

pub type SecTrustSettingsResult = u32;

pub const kSecTrustSettingsResultInvalid: SecTrustSettingsResult = 0;
pub const kSecTrustSettingsResultTrustRoot: SecTrustSettingsResult = 1;
pub const kSecTrustSettingsResultTrustAsRoot: SecTrustSettingsResult = 2;
pub const kSecTrustSettingsResultDeny: SecTrustSettingsResult = 3;
pub const kSecTrustSettingsResultUnspecified: SecTrustSettingsResult = 4;

extern "C" {
    pub fn SecTrustSettingsCopyCertificates(
        domain: SecTrustSettingsDomain,
        certsOut: *mut CFArrayRef,
    ) -> OSStatus;
    pub fn SecTrustSettingsCopyTrustSettings(
        certificateRef: SecCertificateRef,
        domain: SecTrustSettingsDomain,
        trustSettings: *mut CFArrayRef,
    ) -> OSStatus;
    pub fn SecTrustSettingsSetTrustSettings(
        certificateRef: SecCertificateRef,
        domain: SecTrustSettingsDomain,
        trustSettingsDictOrArray: CFTypeRef,
    ) -> OSStatus;
}

这是我调用该函数的方式:

pub fn set_trust_settings(cert: &SecCertificate) -> Result<()>{
    let domain = kSecTrustSettingsDomainAdmin;
    let trust_settings: CFTypeRef = ptr::null_mut();
        cvt(unsafe {
            SecTrustSettingsSetTrustSettings(
                cert.as_CFTypeRef() as *mut _,
                domain,
                trust_settings,
            )
    })
}

Notes

  • sudo security add-trusted-certs [..]正常工作,没有任何问题
  • 我想添加此功能,以允许用户以编程方式添加我的应用程序证书,而不是每次手动添加它,我也想实现删除证书,以便在会话后删除它们
  • 我使用的是带有M2的MacOS 13
  • sudo security authorizationdb write com.apple.trust-settings.admin allow美元不管用

推荐答案

official documentation中,有一行指定此函数仅在GUI environment中调用时才起作用.

我的解决方案是创建一个minimal macos bundle app,在需要时调用:

tokio::process::Command::new("open").arg("./path/app_name.app")

Rust相关问答推荐

在Tauri中获取ICoreWebView 2_7以打印PDF

程序退出后只写入指定管道的数据

PyReadonlyArray2到Vec T<>

铁 rust 中的共享对象实现特征

对于已经被认为是未定义行为的相同数据,纯粹存在`&;[u32]`和`&;mut[u32]`吗?

在0..1之间将U64转换为F64

rust 蚀生命周期 不匹配-不一定超过此处定义的生命周期

如何获取光标下的像素 colored颜色 ?

Rust:为什么 &str 不使用 Into

在 Rust 中,在第一个空格上分割字符串一次

为什么Rust中无法推断生命周期?

没有明确地说return会产生错误:match arms have incompatible types

如何连接 Rust 中的相邻切片

Rust 引用元组和引用元组

为什么1..=100返回一个范围而不是一个整数?

有没有更好的方法来为拥有 DIsplay 事物集合的 struct 实现 Display?

如何从 Rust 中不同类型的多个部分加入 Path?

为什么这个 Trait 无效?以及改用什么签名?

在 macro_rules 中转义 $ 美元符号

有没有比多个 push_str() 调用更好的方法将字符串链接在一起?