Sự tương tác của người dùng không được cho phép, người dùng cố gắng để đăng nhập một ứng dụng OSX bằng cách sử dụng mãignign


145

Bản dựng tự động của chúng tôi đang chạy trên Jenkins. Bản thân bản dựng đang chạy trên các nô lệ, với các nô lệ được thực thi thông qua SSH.

Tôi gặp lỗi:

00:03:25.113 [codesign-app] build/App.app: User interaction is not allowed.

Tôi đã thử mọi đề nghị tôi đã thấy cho đến nay trong các bài viết khác ở đây:

  • Sử dụng bảo mật mở khóa-móc khóa ngay trước khi ký để mở khóa móc khóa.
  • Di chuyển khóa ký ra vào móc khóa riêng của nó.
  • Di chuyển khóa ký vào móc khóa đăng nhập.
  • Di chuyển khóa ký vào móc khóa hệ thống.
  • Cài đặt thủ công danh sách khóa cho chỉ móc khóa có chứa khóa.

Trong mọi trường hợp, tôi nhận được cùng một lỗi.

Trong nỗ lực chẩn đoán sự cố, tôi đã thử chạy lệnh "bảo mật mở khóa" trên thiết bị đầu cuối cục bộ của tôi và thấy rằng nó không thực sự mở khóa móc khóa - nếu tôi tìm trong Keychain Access, biểu tượng khóa vẫn ở đó. Đây là trường hợp cho dù tôi chuyển mật khẩu trên dòng lệnh hay liệu tôi có để nó nhắc tôi về nó không. Mở khóa cùng một móc khóa bằng GUI sẽ nhắc tôi nhập mật khẩu và sau đó mở khóa. Ngoài ra, nếu tôi chạy "khóa bảo mật", tôi sẽ thấy khóa phím ngay sau khi chạy lệnh. Điều này khiến tôi nghĩ rằng móc khóa mở khóa không thực sự hoạt động. Tôi trải nghiệm hành vi tương tự trên Lion (mà chúng tôi đang sử dụng cho các nô lệ xây dựng) và Mavericks (mà tôi đang phát triển.)

Tiếp theo, tôi đã thử thêm -v vào tất cả các lệnh bảo mật:

list-keychains "-d" "system" "-s" "/Users/tester/.secret/App.keychain"
Listing keychains to see if it was added: ((
        "/Library/Keychains/System.keychain"
))
unlock-keychain "-p" "**PASSWORD**" "/Users/tester/.secret/App.keychain"
build/App.app: User interaction is not allowed.

Từ điều này, dường như các móc khóa danh sách là những gì không hoạt động. Có lẽ không làm việc. : /

Có một câu hỏi tương tự ở đây . Giải pháp rất thú vị - đặt "SessionCreate" thành true trong launchctl. Nhưng tôi không xây dựng trên bản gốc - quá trình xây dựng của tôi được bắt đầu từ SSH trên máy xây dựng nô lệ. Có lẽ có một cách dòng lệnh để thực hiện launchctl đang làm gì khi bạn chạy "SessionCreate"?


Làm cách nào để đặt mật khẩu móc khóa trên Circleci?
Sachin Kumaram

@SachinKumaram nghe có vẻ là một câu hỏi mới khả thi?
Trejkaz

Câu trả lời:


205

Tôi cũng đã chiến đấu này. Không có gì giúp được cho đến khi tôi thử đề xuất trên http://devnet.jetbrains.com/thread/311971 . Cảm ơn tro cốt!

Đăng nhập người dùng bản dựng của bạn thông qua GUI và mở Keychain Access. Chọn khóa riêng ký của bạn, nhấp chuột phải, chọn Nhận thông tin, thay đổi sang tab Kiểm soát truy cập và chọn "Cho phép tất cả các ứng dụng truy cập mục này".

tab kiểm soát truy cập


2
Không có gì. Bạn cũng có thể xem xét việc thêm mã vào danh sách ứng dụng ở phía dưới thay vì cho phép tất cả các ứng dụng như tôi đã làm. Nó đã có trong ảnh chụp màn hình của tôi, nhưng tôi nghĩ ban đầu nó không có.
bmauter

3
Tôi đã phải bỏ ẩn thư mục / usr với apple.stackexchange.com/a/34872/6052 để có thể thêm codesignvào danh sách "Luôn cho phép".
Heath

24
chỉ cần lưu ý rằng ngoài việc này, bạn cũng phải làm toàn bộ security unlock-keychainnội dung
cwd

13
Ngoài ra, bạn có thể muốn chuyển các khóa của mình từ đăng nhập sang hệ thống để chúng có thể truy cập được khi bạn thực hiện các bản dựng từ xa trên máy của mình.
Kirtian

8
Có ai biết cách nào để làm điều này từ dòng lệnh không? Máy xây dựng từ xa của tôi sẽ không cho phép tôi thực hiện việc chia sẻ màn hình này vì lý do bảo mật .
devios1

78

Chà, tôi đoán là tôi sẽ trả lời câu hỏi của chính mình hôm nay, bởi vì sau khi đâm vào nó hơn hai ngày rưỡi, một trong những điều tôi đã cố gắng dường như đã có hiệu quả. Tôi sẽ quay trở lại với nó bây giờ và hy vọng nó tiếp tục hoạt động.

Về cơ bản, có vẻ như nó đi xuống để -d systemkhông thực sự làm việc. Vì vậy, rất nhiều câu trả lời cho các câu hỏi khác xung quanh đây có lẽ nên được cập nhật để phản ánh điều đó.

security -v list-keychains -s "$KEYCHAIN" "$HOME/Library/Keychains/login.keychain"
security list-keychains # so we can verify that it was added if it fails again
security -v unlock-keychain -p "$KEYCHAIN_PASSWORD" "$KEYCHAIN"
codesign --sign "$SIGNER_IDENTITY" --force --signature-size 9600 \
         --resource-rules src/AppResourceRules.plist --timestamp --verbose \
         "$APP"

17
Cảm ơn. Tôi đã có thể thu hẹp điều này. Chỉ cần chạy lệnh sau ngay trước khi thử xây dựng: security -v Unlock-key -p "$ KEYCHAIN_PASSWORD" "$ HOME / Library / Keychains / login.keychain"
pir800

3
Vì vậy, không có cách nào để truy cập codesignthông qua ssh mà không thực sự lưu trữ mật khẩu đăng nhập bên trong một số tập lệnh?
chakrit

2
@chakrit trong ví dụ trên, tôi chỉ truyền mật khẩu móc khóa chứ không nhập mật khẩu đăng nhập. Tôi nhận ra rằng đối với nhiều người dùng, móc khóa đăng nhập là móc khóa duy nhất, nhưng trong trường hợp của chúng tôi, chúng tôi giữ các khóa ký trong một kho khóa riêng để giúp chúng dễ dàng đồng bộ hóa hơn để xây dựng máy. Nhưng vâng, rất nhiều thứ này có vẻ khá bất tiện cho các bản dựng tự động, khiến tôi tự hỏi liệu Apple thậm chí có làm các bản dựng tự động hay không.
Trejkaz

@Trejkaz oh được rồi, ít nhất chia sẻ mật khẩu móc khóa không tệ như vậy.
chakrit

Trong trường hợp sử dụng các bản dựng từ xa tự động của tôi, việc lưu mật khẩu móc khóa vào một .envtệp không phải là xấu, vì .envtệp đã chứa các khóa nhạy cảm, vd. AWS và Heroku. Trong trường hợp của chúng tôi, thông tin đăng nhập mã liên quan đến bản dựng được lưu trữ trong Keychain mới được tạo sau đó sẽ bị xóa sau khi xây dựng. Sau đó, nó được tạo lại một lần nữa cho bản dựng tiếp theo. Tuy nhiên, loginmóc khóa vẫn phải được mở, do đó, security unlock-keychain -p pass login.keychainliên kết bị thiếu ở đây. Cảm ơn!
Petrus Repo

19

Không có câu trả lời nào khác làm việc cho tôi.

Điều cuối cùng đã cứu tôi là bài đăng này

Để tổng hợp, điều này có thể được gây ra bởi thời gian chờ mặc định là 5 phút, điều này sẽ gây ra lỗi này sau một quá trình xây dựng dài.

Sửa chữa:

security set-keychain-settings -t 3600 -l ~/Library/Keychains/login.keychain

2
Trên El Capitan, bạn cũng có thể làm điều đó thông qua giao diện người dùng. Chỉ cần mở ứng dụng móc khóa, nhấp chuột phải vào móc khóa của bạn (đăng nhập, hệ thống, v.v.) và nhấp vào thứ gì đó phù hợp với 'cài đặt thay đổi cho <your_keychain>' tốt nhất.
rubybeginner

Điều này luôn đặt quyền truy cập móc khóa Hệ thống của tôi trở lại Confirmngay cả sau khi tôi thay đổi quyền truy cập. : /
Alex Zavatone

Nó rất hữu ích cho tôi !!
Nori

Tôi đã vật lộn với nó trong 2 ngày, trước khi tôi tìm thấy bình luận của bạn, cảm ơn !!!
Gilad Novik

16

Hãy thử gọi security unlock-keychaincodesignnhư một lệnh một dòng. Điều này đã giúp tôi. Cái gì đó như:

security unlock-keychain -p <password> /Users/<user>/Library/Keychains/login.keychain && codesign --force --verify --verbose --sign "<certificate id>" <app name>

4
Điều đó giống như làm trên hai dòng. Tôi đoán sự khác biệt là nếu lệnh đầu tiên thất bại, nó sẽ không chạy lệnh thứ hai.
Trejkaz

1
Đối với tôi họ không giống nhau. Tôi gọi họ qua ant sshexecvà mỗi lần nó tạo ra một phiên ssh mới.
ZhekaKozlov

2
Bạn cũng có thể thực hiện nhiều hơn một dòng thông qua một phiên ssh duy nhất, nếu bạn thực sự muốn. Vì vậy, ... nó vẫn như vậy, ngoài việc xử lý lỗi.
Trejkaz

13

Sử dụng Bảo mật để tạo Keychain cho / usr / bin / Codeign

Nhập chứng chỉ và làm cho nó hoạt động với mãign theo lập trình không phải là vấn đề sử dụng khóa hoặc đăng nhập hệ thống hoặc cầu nguyện với một vị thần của mật mã. Bạn chỉ cần có các quyền chính xác được thiết lập. Tôi khuyên bạn nên tạo một móc khóa mới đặc biệt cho mục đích Codeign.

Những ngày này để có được codesignkhông mang lại một errSecInternalComponentbạn cần phải có danh sách phân vùng (ACL) chính xác. Tôi sẽ đi qua các bước:

Tạo Keychain

security create-keychain -p "${KEYCHAIN_PASSWORD}" "${KEYCHAIN_NAME}"

tại thời điểm này, móc khóa được mở khóa nhưng sẽ không xuất hiện Keychain Access.

Thêm Keychain mới vào danh sách tìm kiếm

security list-keychains -s "${KEYCHAIN_NAME}" "${OLD_KEYCHAIN_NAMES[@]}"

Thêm Keychain mới vào danh sách. Nếu bạn làm lấy không đầu tiên ra khỏi danh sách ban đầu từ list-keychainsbạn sẽ không còn phải login.keychaintìm kiếm danh sách của bạn.

Mở khóa

security unlock-keychain -p "${KEYCHAIN_PASSWORD}" "${KEYCHAIN_NAME}"

Điều này là dư thừa nếu bạn đã tạo Keychain ở trên, nhưng nếu Keychain đã tồn tại thì cần thiết.

Xóa mặc định khỏi Keychain

security set-keychain-settings "${TESTING_KEYCHAIN}"

Bằng cách không chỉ định bất kỳ đối số nào, điều này sẽ đặt thời gian chờ tự động khóa thành không giới hạn và loại bỏ tự động khóa khi ngủ.

Nhập certs ký của bạn từ .p12

security import "${DIST_CER}" -P "${CERTIFICATE_PASSWORD}" -k "${KEYCHAIN_NAME}" -T /usr/bin/codesign

Nhập certs và cung cấp codesignquyền truy cập thông qua -Ttùy chọn.

Đặt ACL trên móc khóa

security set-key-partition-list -S apple-tool:,apple: -s -k "${KEYCHAIN_PASSWORD}" "${KEYCHAIN_NAME}"

Đây là một yêu cầu mà nhiều người bỏ lỡ. Bạn có thể thấy macOS làm gì bằng cách sử dụng dump-móc khóa. Mà trong trường hợp codeigning yêu cầu apple:apple-tool:. -sđề cập đến việc ký giấy chứng nhận.

Gitlab-Runner, Jenkins và những người tương tự

Một điều rất quan trọng đối với bất kỳ hệ thống chạy hoặc xây dựng kiểu CI nào là đảm bảo quy trình được bắt đầu từ launchdmột cách chính xác. Hãy chắc chắn rằng plist của bạn chứa <SessionCreate> </true>.

Không khớp chính xác chủ sở hữu của móc khóa với quy trình xây dựng và đảm bảo rằng phiên bảo mật được tạo sẽ dẫn đến tất cả các loại đau đầu. Nói một cách chẩn đoán, bạn có thể giới thiệu list-keychainsvà xem liệu đầu ra có phù hợp với mong đợi của bạn không.

Đây là từ trang launchd.plistcon người:

SessionCreate <boolean>

Khóa này xác định rằng công việc sẽ được sinh ra trong phiên kiểm toán bảo mật mới thay vì phiên mặc định cho bối cảnh thuộc về. Xem auditon (2) để biết chi tiết.

UserName <string>

Khóa tùy chọn này chỉ định người dùng để chạy công việc như. Khóa này chỉ áp dụng cho các dịch vụ được tải vào miền hệ thống đặc quyền.

GroupName <string>

Khóa tùy chọn này chỉ định nhóm để chạy công việc như. Khóa này chỉ áp dụng cho các dịch vụ được tải vào miền hệ thống đặc quyền. Nếu UserName được đặt và GroupName thì không, nhóm sẽ được đặt thành nhóm chính của người dùng.

Cuối cùng là codeign

Bạn có thể tra cứu băm chứng chỉ ký bằng cách sử dụng find-identity

security find-identity -p codesigning -v

Codign một khung, dylib, vv

/usr/bin/codesign --verbose=4 -f -s "$SIGNER_HASH" "$SIGNABLE"

Mã hóa gói ứng dụng

/usr/bin/codesign --verbose=4 -f -s "$SIGNER_HASH" --entitlements entitlements.xcent "$SIGNABLE"

Ghi chú cuối cùng - nếu bạn nhìn vào cách Xcode thực hiện, họ sẽ thiết lập CODESIGN_ALLOCATEđể sử dụng một mã có trong Xcode chứ không phải trong /usr/bin.

export CODESIGN_ALLOCATE="$( xcrun --find codesign_allocate )"

Đường dẫn tìm kiếm được đặt thành ${PLATFORM_PATH}:${TOOLCHAIN_PATH}:${PATH}, trong đó đường dẫn PLATFORM là thư mục / usr / bin cho SDK mục tiêu đã cho và TOOLCHAIN_PATH là / usr / bin cho các công cụ lưu trữ Xcode.


3
Anh bạn chắc chắn có thể viết một bài báo về nó, tôi đã tìm kiếm điều này từ 2 ngày. Tôi không biết có bao nhiêu thứ và bài viết stackoverflow tôi đọc. Cảm ơn bạn nhiều !
Damien

Cảm ơn cho hướng dẫn hữu ích này!
Taras Nikulin

ACL trên móc khóa là phần còn thiếu đối với tôi. cảm ơn đã giải thích rõ ràng ạ!
Keuha

11

Đặt chìa khóa của bạn vào móc khóa Hệ thống


Nhưng nó vẫn hỏi tên người dùng và mật khẩu
Durai Amuthan.H

Làm cách nào để đặt chìa khóa vào móc khóa hệ thống ....... sẽ sao chép dán từ truy cập móc khóa hoạt động?
Ashish Karpe

Kéo và thả @AshishKarpe
Alistra

Đã kéo và thả vẫn nhận được cùng một lỗi: === BUILD TARGET PatientPortal CỦA DỰ ÁN PatientPortal VỚI CONFIGURATION Debug === Kiểm tra các phụ thuộc Không tìm thấy hồ sơ nào cho 'com.abc.xyz360': Xcode không thể tìm thấy hồ sơ cung cấp phù hợp với 'com .abc.xyz360 '. Cần ký mã cho loại sản phẩm 'Ứng dụng' trong SDK 'iOS 10.2'
Ashish Karpe

Nó nói rằng bạn không có hồ sơ cung cấp được cài đặt trên máy, không phải là bạn đang thiếu các khóa @AshishKarpe
Alistra

5

Vì vậy, đây là lệnh hoạt động. -Alà để ngăn Mac hỏi mật khẩu. Nhập vào system.keychain không yêu cầu GUI.

sudo security import <cert.p12> -k "/Library/Keychains/System.keychain" -P <passphrase> -A


3

Móc khóa của tôi đã bị khóa. Nó chống lại những tiến bộ của tôi để thay đổi thực tế đó ...

Keychain Access-> Keychain First Aid-> Repair, et voilá !


2

Mở khóa móc khóa là không đủ. Bạn cũng phải đặt quyền truy cập khóa riêng thành "Cho phép tất cả các ứng dụng truy cập mục này". Và để làm điều đó từ dòng lệnh yêu cầu nhập lại khóa. Vì vậy, để có được mọi thứ tại một thời điểm:

Mở khóa móc khóa đăng nhập nếu nó bị khóa. Nó không nên bị khóa mặc dù, nhưng dù sao đây là cách bạn làm điều đó:

security -v unlock-keychain -p "$KEYCHAIN_PASSWORD" "~/Library/Keychains/login.keychain"

Nếu vì một lý do nào đó, máy dựng của bạn có khóa đăng nhập bị khóa và bạn không muốn để lộ mật khẩu đó trong tập lệnh, thì bạn nên sử dụng một móc khóa khác. Bạn có thể tạo một cái tại chỗ và sử dụng nó trong lệnh trước và lệnh sau. Để tạo một tại chỗ:

security create-keychain -p 'temporaryPassword' MyKeychain.keychain
security list-keychains -d user -s login.keychain MyKeychain.keychain

Sau đó nhập chứng chỉ và khóa riêng được liên kết vào móc khóa đăng nhập bằng tham số -A. Lưu ý rằng bạn không cần phải sudo cho tất cả điều này ...

security import <cert.p12> -k "~/Library/Keychains/login.keychain" -P <passphrase> -A

Tham số -A là thông số sẽ làm cho khóa riêng của bạn được đặt thành "Cho phép tất cả các ứng dụng truy cập mục này"

Vì vậy, bằng cách sử dụng tất cả những thứ này, bạn sẽ có thể tạo một tập lệnh cài đặt chứng chỉ cần thiết để xây dựng một bản phát hành ipa và ký tên mà không cần nhắc. Bạn có thể lưu trữ tệp .p12 trong repo của mình, vì vậy bất kỳ máy nào cũng có thể xây dựng ipa của bạn mà không yêu cầu thiết lập thủ công.


2

Ngoài việc mở khóa móc khóa (như đã đề cập trong các câu trả lời khác), bạn cần cho phép truy cập từ tất cả các ứng dụng vào mã thông báo xác thực Xcode trong móc khóa:

  • Chọn móc khóa "đăng nhập"
  • Chọn danh mục "Tất cả các mục"
  • Tìm kiếm từ khóa "xcode"
  • Chọn "Cho phép tất cả các ứng dụng truy cập mục này" cho tất cả các mã thông báo Xcode
  • Đừng quên thêm bước mở khóa móc khóa (từ các câu trả lời trước)

Ảnh chụp màn hình


1

Nhập khóa của bạn vào Hệ thống móc khóa. Bạn có thể sử dụng lệnh này:

sudo security import YourKey.p12 -k /Library/Keychains/System.keychain -P PasswordToYourKey -T /usr/bin/codesign

1

Vì vậy, tôi đã thử mọi câu trả lời ở đây và một cái gì đó không được thêm vào. Cuối cùng tôi đã tìm ra khi tôi khởi động lại dịch vụ CI của mình, nó đang chạy dưới một người dùng khác so với tôi dự kiến. Việc thay đổi người dùng thực sự có quyền truy cập vào khóa trong chuỗi đăng nhập của họ đã sửa mọi thứ. Đây có thể không phải là một vấn đề phổ biến, nhưng muốn ghi lại lý do cụ thể của tôi cho lỗi này, trong trường hợp nó xảy ra với người khác.


Tôi đã có cùng vấn đề y hệt. Cảm ơn bạn vì câu trả lời. :)
Paweł K

0

Đối với tôi không có gì hoạt động dường như phải cài đặt lại Xcode một lần nữa. Jenkins tiếp tục đưa ra lỗi tương tự. Bạn sẽ tiết kiệm được nhiều thời gian nếu bạn chỉ cần di chuyển cài đặt Xcode sang Thùng rác và cài đặt lại. Đảm bảo bạn chạy lệnh Codeign từ dòng lệnh ít nhất một lần.

Ngay cả sau khi bạn gặp lỗi tương tự, hãy thử cài đặt 'Mở khóa Keychain?' thuộc tính trong Jenkins và cung cấp đường dẫn đến login.keychain của bạn trong /Users/$ nbUSER Bolog / L Library / Keychains / llo.keychain

Tôi hy vọng chúa sẽ ở bên bạn sau đó.


0

Trong trường hợp của tôi, điều này là do một móc khóa được tạo ra với thời gian chờ mặc định là 300 giây và một trình biên dịch xcode dài kéo dài hơn 300 giây. Cách giải quyết, đối với tôi, là để gọi:

security set-keychain-settings -t <longer timeout in seconds> <keychain>

ngay sau khi tạo móc khóa tạm thời.


0

Tôi đã xem qua tất cả các đề xuất này và vẫn gặp vấn đề khi sử dụng fastlane gymtrong công việc của Jenkins. Tôi đã cài đặt chứng chỉ và mở khóa bằng khóa, và có thể mã hóa trên nô lệ khi tôi tự chạy lệnh Codeign trên dòng lệnh.

Như một giải pháp thay thế, nếu Jenkins kết nối với nô lệ bằng JNLP thay vì SSH, bạn sẽ có thể mã hóa.


0

Đối với tôi, điều đó xảy ra khi có một móc khóa thứ hai được thêm bằng tay và nó bị khóa. Vì một số lý do, codesigncố gắng truy cập vào khóa bị khóa và không thành công mặc dù các chứng chỉ nằm trong khóa đăng nhập (và được mở khóa). Mở khóa cái thứ hai giải quyết vấn đề. Chỉ là không có ý nghĩa với tôi.


-1

Sau khi thử một số giải pháp trên. Tôi nhận ra rằng một yếu tố tôi có, là tôi đã bắt đầu xây dựng bằng Bảng điều khiển ION. Khi tôi quay trở lại để tạo bản dựng từ ứng dụng Terminal, mọi thứ đều hoạt động tốt.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.