利用终端远程导入p12证书

  • 摘要:

    最近受疫情影响,在家里办公。公司用来持续集成的苹果垃圾桶上的证书过期了,又不能去公司操作,所以研究了一下利用ssh和命令行工具远程导入p12证书的方法。

  • keywords:证书过期、远程、命令行、导入p12

1.常规UI操作

Xcode利用codesign进行签名的时候,可能需要用户进行授权。这时会有一个弹窗,让用户输入Mac开机密码并选择一次/总是可以访问

codesign的keychain访问权限

1.1 问题

  • 要是选择了"Deny"怎么办?

    1. 打开钥匙串App
    2. 点登录和我的证书
    3. 找到iPhone Developer:XXX@XXX(XXX)的证书,右击删除
    4. 重新打开Xcode编译并运行Command+R,会再次弹出codesign的权限弹框,输入Mac开机密码并点始终允许即可。
  • 现在是远程控制没有图形界面怎么办?
    这时就需要我们的终端出马了。

2. 终端操作

  • 远程登录

    //user_name:用户名
    //ip:设备公网ip地址
    ssh user_name@ip
    
  • security命令

    现在的需求就是/usr/bin/codesign在执行的时候能访问钥匙串中p12的私钥。目前有两种解决办法,都需要用到security命令。输入security -h即可参看帮助文档。

help                                 Show all commands, or show usage for a command.
list-keychains                       Display or manipulate the keychain search list.
list-smartcards                      Display available smartcards.
default-keychain                     Display or set the default keychain.
login-keychain                       Display or set the login keychain.
create-keychain                      Create keychains and add them to the search list.
delete-keychain                      Delete keychains and remove them from the search list.
lock-keychain                        Lock the specified keychain.
unlock-keychain                      Unlock the specified keychain.
set-keychain-settings                Set settings for a keychain.
set-keychain-password                Set password for a keychain.
show-keychain-info                   Show the settings for keychain.
dump-keychain                        Dump the contents of one or more keychains.
create-keypair                       Create an asymmetric key pair.
add-generic-password                 Add a generic password item.
add-internet-password                Add an internet password item.
add-certificates                     Add certificates to a keychain.
find-generic-password                Find a generic password item.
delete-generic-password              Delete a generic password item.
set-generic-password-partition-list  Set the partition list of a generic password item.
find-internet-password               Find an internet password item.
delete-internet-password             Delete an internet password item.
set-internet-password-partition-list Set the partition list of a internet password item.
find-key                             Find keys in the keychain
set-key-partition-list               Set the partition list of a key.
find-certificate                     Find a certificate item.
find-identity                        Find an identity (certificate + private key).
delete-certificate                   Delete a certificate from a keychain.
delete-identity                      Delete an identity (certificate + private key) from a keychain.
set-identity-preference              Set the preferred identity to use for a service.
get-identity-preference              Get the preferred identity to use for a service.
create-db                            Create a db using the DL.
export                               Export items from a keychain.
import                               Import items into a keychain.
export-smartcard                     Export items from a smartcard.
cms                                  Encode or decode CMS messages.
install-mds                          Install (or re-install) the MDS database.
add-trusted-cert                     Add trusted certificate(s).
remove-trusted-cert                  Remove trusted certificate(s).
dump-trust-settings                  Display contents of trust settings.
user-trust-settings-enable           Display or manipulate user-level trust settings.
trust-settings-export                Export trust settings.
trust-settings-import                Import trust settings.
verify-cert                          Verify certificate(s).
authorize                            Perform authorization operations.
authorizationdb                      Make changes to the authorization policy database.
execute-with-privileges              Execute tool with privileges.
leaks                                Run /usr/bin/leaks on this process.
error                                Display a descriptive message for the given error code(s).
create-filevaultmaster-keychain      Create a keychain containing a key pair for FileVault recovery use.
smartcards                           Enable, disable or list disabled smartcard tokens.
translocate-create                   Create a translocation point for the provided path
translocate-policy-check             Check whether a path would be translocated.
translocate-status-check             Check whether a path is translocated.
translocate-original-path            Find the original path for a translocated path.
requirement-evaluate                 Evaluate a requirement against a cert chain.

2.1 方式①

  • 找到Keychain默认路径

    //一般是:~/Library/Keychains/login.keychain-db
    security default-keychain
    
  • 解锁Keychain

    //$pwd是Mac开机密码
    security unlock-keychain -p $pwd ~/Library/Keychains/login.keychain-db
    
  • 导入p12证书

    //$p12_file_path:p12证书的文件地址
    //$p12_pwd:证书的密码
    security import $p12_file_path -k ~/Library/Keychains/login.keychain-db -P $p12_pwd
    
  • 打包代码中,在执行xcodebuild前执行security unlock-keychain

    ...
    //解锁keychain
    security unlock-keychain -p $pwd ~/Library/Keychains/login.keychain-db
    xcodebuild clean -workspace $BUILD_TARGET.xcworkspace -scheme $BUILD_SCHEME -configuration $BUILD_CONFIG
    xcodebuild archive -workspace $BUILD_TARGET.xcworkspace -scheme $BUILD_SCHEME -configuration $BUILD_CONFIG -UseModernBuildSystem=NO 2>$BUILD_ERROR_LOG DEPLOYMENT_POSTPROCESSING=YES
    ...
    

2.2 方式②

security import
Usage: import inputfile [-k keychain] [-t type] [-f format] [-w] [-P passphrase] [options...]
    -k  Target keychain to import into
    -t  Type = pub|priv|session|cert|agg
    -f  Format = openssl|openssh1|openssh2|bsafe|raw|pkcs7|pkcs8|pkcs12|netscape|pemseq
    -w  Specify that private keys are wrapped and must be unwrapped on import
    -x  Specify that private keys are non-extractable after being imported
    -P  Specify wrapping passphrase immediately (default is secure passphrase via GUI)
    -a  Specify name and value of extended attribute (can be used multiple times)
    -A  Allow any application to access the imported key without warning (insecure, not recommended!)
    -T  Specify an application which may access the imported key (multiple -T options are allowed)
Use of the -P option is insecure

    Import items into a keychain.

我们发现security import方法中可以提供完全-A和部分应用-T的访问权限。

//解锁钥匙串
security unlock-keychain -p pwd ~/Library/Keychains/login.keychain-db
//导入证书
security import $p12_file_path -k ~/Library/Keychains/login.keychain-db -P $pwd -T /usr/bin/codesign
  • 关键操作:set-key-partition-list命令
    OS X 10.12.5 Sierra之后,苹果添加了Keychain忽略访问控制设置和UI提示以获得许可(security / codesign in Sierra: Keychain ignores access control settings and UI-prompts for permission),所以要求配置partition list,作为 ACL(Access Control Lists)的补充,根据应用签名,对访问进行权限控制。参考资料
security set-key-partition-list -S apple-tool:,apple: -s -k $pwd ~/Library/Keychains/login.keychain-db

解释一下其中几个参数:

  • -S:提供的访问权限,多个 key 用逗号分隔。苹果的工具可以用 apple-tool:,apple:,如 codesign 就可以设置这两个 key。
  • -s:指定用于 codesign 的 private key。
  • -k:修改 partition list 需要提供钥匙串密码。

所以以上的命令作用为:给 login.keychain中用于codesign的 private key,写入苹果产品的权限。

注意:set-key-partition-lis 对 key 的操作是重写,不是追加。

  • 附上set-key-partition-list的使用说明
set-key-partition-list
Usage: set-key-partition-list [options...] [keychain]
    -a  Match "application label" string
    -c  Match "creator" (four-character code)
    -d  Match keys that can decrypt
    -D  Match "description" string
    -e  Match keys that can encrypt
    -j  Match "comment" string
    -l  Match "label" string
    -r  Match keys that can derive
    -s  Match keys that can sign
    -t  Type of key to find: one of "symmetric", "public", or "private"
    -u  Match keys that can unwrap
    -v  Match keys that can verify
    -w  Match keys that can wrap
    -S  Comma-separated list of allowed partition IDs
    -k  password for keychain (required)
    If no keychains are specified to search, the default search list is used.
    Set the partition list of a key.
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,839评论 6 482
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,543评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 153,116评论 0 344
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,371评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,384评论 5 374
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,111评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,416评论 3 400
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,053评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,558评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,007评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,117评论 1 334
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,756评论 4 324
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,324评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,315评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,539评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,578评论 2 355
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,877评论 2 345