Một lần cài OpenVPN chết dưới Chocolatey với lỗi chữ ký hoặc khóa thường không phải vấn đề tải xuống. Gói chạy một bước xác minh gọi gpg, và Windows phân giải cái tên trần đó qua PATH. Nếu Git for Windows được cài trước, gpg.exe đi kèm của nó đứng trước bản dựng GnuPG mà OpenVPN mong đợi, và chương trình sai trả lời lời gọi. Lỗi bạn thấy là điều chương trình kia quyết định phàn nàn, vì thế nó không bao giờ nêu nguyên nhân thật.

Thứ tự trong PATH quyết định gpg nào chạy

Windows không có sổ đăng ký trung tâm cho tên tệp thực thi. Khi một tiến trình yêu cầu gpg mà không có đường dẫn đầy đủ, bộ nạp đi qua các mục trong PATH theo thứ tự và chạy kết quả khớp đầu tiên. Git for Windows cung cấp một bản dựng GnuPG tối thiểu trong thư mục usr/bin của nó để các commit đã ký hoạt động, và trình cài đặt của nó thường đặt thư mục đó gần đầu PATH của người dùng.

GnuPG cài vào thư mục riêng, thường là C:\Program Files (x86)\GNU\GnuPG\pub, và mục đó có thể nằm sau trong danh sách hoặc thiếu hoàn toàn khỏi PATH của người dùng. Hai chương trình chia sẻ một cái tên và phần lớn giao diện dòng lệnh nhưng không chia sẻ trạng thái: bản dựng Git tìm vòng khóa ở nơi khác, có thể là phiên bản khác, và có thể không chấp nhận các tùy chọn mà trình cài đặt truyền vào. Sự không khớp đó hiện ra thành lỗi chữ ký hoặc khóa, đó là báo cáo trung thực về những gì tệp nhị phân sai đã thấy. Không có gì trong thông báo chỉ ra bộ nạp, vì bộ nạp đã làm đúng những gì được bảo.

Vì sao shell bạn khởi động quyết định kết quả

Quy tắc kế thừa là phần đáng để thấm nhuần. Tiến trình con nhận môi trường của shell đã khởi chạy nó, nên thứ tự quan trọng là thứ tự tại thời điểm Chocolatey bắt đầu, không phải thứ tự sau khi bạn sửa.

Đó là lý do sửa PATH trong cửa sổ cài đặt rồi chạy lại bản cài trong cùng terminal thường không thay đổi gì: terminal đã giữ môi trường cũ. Hãy khởi động shell mới sau mỗi lần sửa, và xác nhận bằng where.exe gpg trong shell mới đó trước khi thử lại. Cũng vì thế một mục ở cấp máy có thể thắng thay đổi ở cấp người dùng, do một số trình cài đặt thêm vào đầu PATH của máy và các mục cấp máy được đánh giá trước mục cấp người dùng. Nếu cả hai cấp đều chứa đường dẫn GnuPG, hãy quyết định bạn thực sự duy trì cấp nào.

Cách sửa thứ nhất: sắp xếp lại các mục

Cách sửa chính xác là để thư mục GnuPG mong muốn thắng. Mở biến môi trường của người dùng, sửa Path, và chuyển thư mục pub của GnuPG lên trên các mục Git. Sau đó mở cửa sổ PowerShell mới, vì cửa sổ đang chạy vẫn giữ danh sách cũ.

Cách khác là môi trường sạch tạm thời cho bản cài: bỏ các mục Git, mở shell mới, chạy choco install openvpn, rồi khôi phục chúng.

Cả hai cách đều hoạt động vì cùng một lý do, và cách thứ hai chỉ an toàn nếu bạn thực sự khôi phục các mục. Xóa usr/bin của Git khỏi PATH phá hỏng vĩnh viễn các commit đã ký, và công cụ tiếp theo mong đợi một gpg hoạt động sẽ thất bại với thông báo riêng của nó không liên quan gì đến OpenVPN. Nếu chọn con đường tạm thời, hãy giữ giá trị gốc của Path trong phiếu để việc khôi phục là dán chứ không phải dựng lại. Sắp xếp các mục là cách sửa lâu bền; xóa chúng là giải pháp tạm có ngày hết hạn.

Xác minh, rồi đặt lại

Xác minh trước và sau trong cùng ngữ cảnh người dùng mà Chocolatey sẽ dùng. where.exe gpg liệt kê mọi kết quả khớp theo thứ tự phân giải, nên dòng đầu tiên là dòng sẽ chạy; Get-Command gpg -All cho cùng câu trả lời với nhiều chi tiết hơn trong PowerShell. Sau đó gpg --version xác nhận bản dựng nào đã trả lời.

Nếu where.exe vẫn liệt kê bản sao Git trước, thay đổi thứ tự chưa đến được phiên đó, và cài lại bao nhiêu lần cũng không giúp. Kiểm tra PATH của cả máy và người dùng bằng [Environment]::GetEnvironmentVariable('Path','Machine') và cùng lời gọi với 'User', vì danh sách hiệu lực được lắp từ cả hai. Sau khi cài thành công, kiểm tra lại bằng openvpn --version và khởi động dịch vụ hoặc GUI một lần, vì gói có thể cài sạch mà vẫn để lại dịch vụ không khởi động.

Nếu một PATH được sắp xếp đúng vẫn thất bại, biến còn lại là phiên bản gói. Một gói Chocolatey được ghim có thể mong đợi một bản dựng GnuPG hoặc đường dẫn cài cụ thể mà máy bạn không có.

Đọc nhật ký của chính gói trước khi thay đổi bất cứ điều gì khác. C:\ProgramData\chocolatey\logs\chocolatey.log ghi lại dòng lệnh đã thất bại và thư mục mà nó chạy từ đó, cho bạn biết lời gọi thất bại là kiểm tra chữ ký, giải nén hay script sau cài đặt. Sự khác biệt đó quyết định bạn còn gỡ lỗi gpg hay không.

Thói quen ngăn lặp lại là coi PATH như trạng thái chia sẻ có thứ tự được ghi lại chứ không phải một túi thư mục. Khi cài một công cụ mang tên nhị phân phổ biến, hãy kiểm tra nó che khuất gì trong shell tiếp theo bạn mở. Rồi ghi lại thứ tự bạn đã chọn, vì trình cài đặt tiếp theo sẽ thêm vào đó và người tiếp theo sẽ thắc mắc vì sao kiểm tra chữ ký thất bại trên máy không có gì thay đổi. Một where.exe trước khi cài tiết kiệm cả vòng lặp.

Bài viết liên quan