• Thứ Sáu, 09/11/2007 14:25 (GMT+7)

    Tạo chữ kí điện tử cho ứng dụng trên Windows Vista

    Lượt xem 20545
    Đánh giá

    Windows Vista ra đời mang đến một sắc thái mới với nhiều cải tiến đáng kể về giao diện đồ họa, đa phương tiện, mạng và đặc biệt là bảo mật. Riêng về phương diện bảo mật, người sử dụng có thể nhận thấy rõ nhiều thay đổi trong quá trình sử dụng hệ điều hành mới này. Không dễ dàng như ở các phiên bản trước, Windows Vista luôn yêu cầu người dùng xác nhận khi muốn chạy bất kì ứng dụng nào, ngay cả với các ứng dụng thuộc hệ điều hành, điều này nhằm tránh việc thực thi những ứng dụng không mong muốn (chương trình mã độc). Tuy nhiên, cũng có ý kiến cho rằng Microsoft đang chuyển bớt trách nhiệm về cho người dùng bằng việc bổ sung User Account Control (UAC - kiểm soát tài khoản người dùng). Bản thân người dùng phải biết tự bảo vệ mình và với những người nhiều kinh nghiệm về bảo mật, tính năng UAC gây không ít phiền toái cho họ.

    Hình 1 - UAC cảnh báo một ứng dụng không xác định được

    Với góc độ của nhà phát triển ứng dụng chạy trên nền Windows Vista, bảo mật cũng là một thử thách mới mẻ và đau đầu khi phải thay đổi khá nhiều thứ trong kiến trúc và cách lập trình, sao cho ứng dụng của mình để có thể đáp ứng trọn vẹn trên Vista.

    Microsoft đưa ra chương trình gọi là Microsoft Windows Vista Logo cho phần mềm, trong đó liệt kê các tiêu chí để một ứng dụng được đánh giá phù hợp hoàn toàn với Windows Vista. Các tiêu chí này phân thành 3 nhóm yêu cầu chính:

    • Yêu cầu về bảo mật và tương thích

    • Yêu cầu về việc cài đặt

    • Yêu cầu về mức độ tin cậy

    Các bạn có thể tham khảo chi tiết ở trang www.microsoft.com.

    Do phạm vi bài viết giới hạn, tác giả sẽ chỉ trình bày một kinh nghiệm để đáp ứng một yêu cầu trong nhóm bảo mật để ứng dụng tương thích với Windows Vista. Đó là Sign Files hay Authenticode, tạm gọi là tạo chữ kí điện tử cho ứng dụng. Đây là một yêu cầu quan trọng trong nhóm yêu cầu về bảo mật và tương thích.
     
    Do việc thông dịch các từ kĩ thuật từ tiếng Anh sang tiếng Việt khó có thể diễn tả hết ý nghĩa của chúng, tác giả sẽ sử dụng các thuật ngữ tiếng Anh nguyên bản, ví dụ các từ certificate, CA, self-sign, public key, private key...

    Chữ kí điện tử cho ứng dụng - Digital Signature

    Trên thực tế, các khái niệm Signature, Sign Files hay Authenticode đã xuất hiện cách đây khá lâu. Việc tạo chữ kí cho ứng dụng nhằm đảm bảo tính toàn vẹn của ứng dụng đó khi đến tay người sử dụng. Tránh trường hợp kẻ xấu lợi dụng thay đổi nội dung một ứng dụng, chèn các mã gây nguy hại đến thông tin người dùng. Với Windows Vista, khái niệm bảo mật này được cài đặt như một tính năng cơ bản của hệ thống. Hoạt động của một ứng dụng được kiểm soát ngay từ khi có yêu cầu thực thi, do đó một ứng dụng có chữ kí điện tử (digital signature) được tin cậy sẽ đảm bảo hoạt động an toàn nhất như ý muốn nhà sản xuất.

    Để đạt được điều này, Windows Vista yêu cầu tất cả các tệp thực thi nhị phân có phần mở rộng như exe, dll, ocx, sys, cpl, drv, scr phải được kí (sign) với một chứng chỉ bảo mật được tin cậy (trusted authenticode certificate), đặc biệt là các ứng dụng thực hiện các thao tác truy xuất đến tài nguyên chung của hệ thống như can thiệp vào thư mục Windows hoặc Program Files, thay đổi thông tin registry ở cấp hệ thống; các driver hoạt động cấp thấp; các ứng dụng đòi hỏi hoạt động với quyền quản trị...

    Chứng chỉ điện tử - Digital Certificate

    Chứng chỉ điện tử (digital certificate) được sử dụng để chứng thực giữa hai thực thể trên mạng liên lạc với nhau, ví dụ giữa client và server. Chứng chỉ điện tử còn được dùng trong việc mã hóa dữ liệu. Trong khái niệm Authenticode ở Windows Vista, chứng chỉ điện tử dùng cho việc tạo chữ kí cho ứng dụng phải được cung cấp và kí nhận bởi một đơn vị cấp chứng chỉ (CA - certificate authority) được hệ thống Windows Vista tin cậy ở cấp cao nhất (Local Machine), được gọi là "Trusted root certification authorities". Một chứng chỉ điện tử thường chứa thông tin của đơn vị được cấp chứng chỉ, public key và public key của CA.

    Certificate Authority (CA) – Là thuật ngữ chỉ nhà cung cấp các chứng chỉ bảo mật. Có một số nhà cung cấp certificate tên tuổi được cài đặt sẵn trong các hệ thống Windows như Verisign, Thawte, GTE, Microsoft ...

    X.509 Certificate – Là chứng chỉ điện tử được tạo bởi một cơ quan chuyên cấp chứng chỉ điện tử, gọi là Certificate Authority (CA).

    Private key – Là khóa riêng chỉ người tạo certificate nắm giữ, dùng kết hợp với giải thuật băm và dữ liệu nguyên thủy để tạo ra chữ kí điện tử. Private key còn được gọi là share secret.

    Public key – Là khóa chung được tạo khi tạo certificate. Khóa này được mọi người sử dụng để kiểm chứng tính toàn vẹn của dữ liệu nhận được có kèm chữ kí điện tử được tạo bằng private key ở trên. Public key và private key tạo nên một cặp public/private, một yếu tố cơ bản của Public Key Infrastructure (PKI).

    Một số khách hàng yêu cầu ứng dụng phải được kí bằng các certificate mang tính thương mại, nó yêu cầu bạn bỏ tiền mua từ các CA có tên tuổi như Verisign, giá tiền có thể tùy thuộc vào thời gian tồn tại và mục đích của certificate. Đồng thời thủ tục để có được certificate loại này khá rườm rà và cũng cần trách nhiệm về mặt pháp lý của bạn hoặc đơn vị bạn đang làm việc. Tuy nhiên, bạn cũng có thể là một CA tự tạo certificate riêng để kí cho ứng dụng của mình, thuật ngữ gọi là self-signed certificate, tạm gọi là chứng chỉ tự kí.

    Các bước tiến hành tạo một self-signed certificate và tạo chữ kí cho ứng dụng gồm:

    - Tạo certificate đại diện cho một CA, bao gồm khóa private và public

    - Tạo chứng chỉ riêng để kí (code signing certificate) cho ứng dụng sau này và dùng chứng chỉ của CA ở trên để kí cho chứng chỉ riêng, kết quả sẽ có một self-signed certificate. Chứng chỉ riêng này cũng phải bao gồm khóa private và public.

    - Sử dụng một công cụ tạo chữ kí (ví dụ SignCode của Microsoft) cho ứng dụng, trong đó sử dụng code signing certificate vừa tạo.

    - Khi cài đặt sản phẩm cho khách hàng, bạn chỉ cần mang theo chứng chỉ public của CA (không phải chứng chỉ code signing) và cài đặt vào vùng "Trusted root certification authorities" ở cấp cao nhất "Local Machine", khi đó hệ thống Windows Vista sẽ chấp nhận chữ kí trên ứng dụng của bạn. Lưu ý: Bạn có thể kí cho ứng dụng của bạn và cài đặt CA certificate để hệ thống tin tưởng ứng dụng của bạn, tuy nhiên bạn vẫn sẽ gặp hiện tượng "gà và trứng" ở chính bộ cài đặt. Bộ cài đặt sẽ không được tin cậy bởi hệ thống ở lần đầu tiên vì khi đó chứng chỉ của bạn chưa được cài vào hệ thống, trừ khi bạn yêu cầu khách hàng tự cài đặt chứng chỉ bằng tay trước.

    Tạo chữ kí điện tử cho ứng dụng

    Dưới đây là hai cách thức tự tạo chứng chỉ điện tử, cách sử dụng nó để tạo chữ kí cho phần mềm và cách cài đặt ở máy sử dụng Windows Vista.

    Phương pháp đầu tiên sử dụng bộ thư viện miễn phí openssl (www.openssl.org) mà tôi đã sử dụng nhiều trong thực tế phát triển phần mềm. Bộ thư viện này có lợi điểm là mã nguồn mở C++, có thể biên dịch và hoạt động trên cả hệ thống Windows và Linux. Phương pháp này gồm 7 bước thực hiện.

    Phương pháp thứ hai sử dụng tập công cụ Authenticode của Microsoft. Tập công cụ này được kèm với thư viện Windows SDK, thường có trong bộ Microsoft Visual Studio 2003 hoặc 2005. Phương pháp này gồm 4 bước thực hiện.

    Phương pháp 1: Sử dụng openssl để tạo CA certificate và self-signed certificate

    Công cụ:

    • openssl.exe: tải ở http://www.openssl.org hoặc Internet

    • signtool.exe: tải ở http://www.microsoft.com, hoặc tìm trong bộ Windows SDK

    Các bước thực hiện:

    • Tạo khóa riêng X509 cho CA, mã hóa dạng Base64 – Mục đích là sẽ dùng khóa riêng này kí nhận cho code signing certificate. Khi tạo, bạn cần cung cấp mật khẩu cho khóa riêng này.

    Lệnh: openssl.exe genrsa -des3 -out VistaCA.key 2048

    Câu lệnh trên sẽ sinh một khóa riêng RSA và được mã hóa bằng thuật toán DES3, kết quả chứa trong tệp VistaCA.key. Lưu ý: bạn có thể đặt tên và phần mở rộng tùy ý.

    • Tạo chứng chỉ X509 cho CA có chứa public key, mã hóa dạng Base64 – Bạn cung cấp các thông tin cho CA, bao gồm tên đại diện cho CA, mã quốc gia, tên thành phố, email và mật khẩu của khóa riêng đã tạo ở trên.

    Lệnh: openssl.exe req -new -x509 -days 365 -key VistaCA.key -config openssl.cnf -out VistaCA.cer

    Câu lệnh trên kết hợp đồng thời việc tạo một yêu cầu cấp certificate, phát sinh chứng chỉ VistaCA.cer trong 365 ngày kể từ ngày hiện tại và sử dụng khóa riêng ở trên để mã hóa. Bạn cũng có thể sử dụng tên và phần mở rộng tùy ý, tuy nhiên hệ thống Windows sẽ tự hiểu nếu bạn sử dụng đuôi .cer. Lưu ý: openssl.cnf cần khi sử dụng chức năng tạo certificate, nó được kèm sẵn trong bộ openssl.

    • Tạo khóa riêng X509 sử dụng để kí code – Thao tác tương tự như tạo khóa cho CA ở trên.

    Lệnh: openssl.exe genrsa -des3 -out VistaCode.key 2048

    • Tạo một yêu cầu kí nhận (certificate signing request) cho chứng chỉ - Để sử dụng CA certificate kí nhận cho chứng chỉ mà bạn sử dụng để kí code, bạn phải tạo một yêu cầu kí nhận. Bạn cần cung cấp thông tin về khóa riêng để kí code vừa tạo ở trên. Kết quả của yêu cầu chứa trong tệp có đuôi .csr
    Lệnh: openssl.exe req -new -key VistaCode.key -config openssl.cnf -out VistaCode.csr

    • Tạo chứng chỉ public X509 để kí code từ yêu cầu ở trên, kèm thêm các khóa public của CA và sử dụng thông tin của CA để kí nhận – Kết quả sẽ chứa trong tệp VistaCode.cer. Đây chính là chứng chỉ tự kí, self-signed certificate.

    Lệnh: openssl.exe x509 -req -days 365 -in VistaCode.csr -CA VistaCA.cer -CAkey VistaCA.key -set_serial 01 -out VistaCode.cer

    • Tạo tệp dạng .pfx định dạng PKCS-12 (thông tin trao đổi cá nhân). Tệp này sử dụng các kết quả của VistaCode bạn vừa tạo và cần khi sử dụng công cụ tạo chữ kí của Microsoft.

    Lệnh: openssl.exe pkcs12 -export -in VistaCode.cer -inkey VistaCode.key -out VistaCode.pfx -name "VistaCode" -des3

    • Tạo chữ kí cho ứng dụng sử dụng self-signed certificate bạn vừa tạo

    Lệnh: signtool.exe sign /f VistaCode.pfx /p your_password /v Your_Software.exe

    Bạn có thể cung cấp thêm không tin về timestamp chứa các thông tin về thời gian hiệu lực của chứng chỉ bằng tham số -t và kèm thêm địa chỉ URL đến một máy chủ timestamp.

    Công cụ signtool sẽ thông báo cho bạn kết quả kí nhận, cảnh báo hoặc lỗi có thể xảy ra.

    Lưu ý:

    * Bạn có thể thực thi nhiều câu lệnh trong một tệp .bat nhằm tiết kiệm thời gian nhập lệnh.

    * Nếu sử dụng các lệnh này trực tiếp trên Windows Vista, bạn có thể cần quyền quản trị (administrator) để các lệnh thực thi thành công; hoặc bạn có thể sử dụng tệp manifest chứa các thông tin giúp hoạt động dưới quyền quản trị.

    * Về ý nghĩa của các tham số khác, hãy tham khảo các trợ giúp từ bộ công cụ sử dụng khóa /?, -? hoặc tham khảo tại trang chủ của công cụ.

    Phương pháp 2: Sử dụng các công cụ của Microsoft để tạo CA certificate và self-signed certificate

    Công cụ:

    • makecert.exe: tải ở http://www.microsoft.com, hoặc tìm trong bộ Windows SDK

    • pvk2pfx.exe: tải ở http://www.microsoft.com, hoặc tìm trong bộ Windows SDK

    • signtool.exe: tải ở http://www.microsoft.com, hoặc tìm trong bộ Windows SDK

    Các bước thực hiện:

    • Tạo chứng chỉ X509 cho CA có chứa public key (.cer) và private key (.pvk) – Công cụ makecert cho phép luôn khóa riêng và chứng chỉ trong một lệnh. Bạn cần cung cấp mật khẩu cho khóa riêng khi thực hiện lệnh này.

    Lệnh: makecert.exe -n "CN=Vista Root CA" -r -a sha1 -sv VistaCA.pvk VistaCA.cer -sr LocalMachine -ss Vista -sky signature

    Tham số -n cần tên theo chuẩn X.500; –r để yêu cầu tạo một self-signed certificate; –a chỉ định giải thuật sinh chữ kí; -sv chỉ định khóa riêng; -sr chỉ định nơi lưu trữ (store location); -ss chỉ định tên nơi lưu trữ (store name) và –sky chỉ định loại khóa, ta sẽ sử dụng loại "signature".

     

     

    Certificate Authority (CA) – Là thuật ngữ chỉ nhà cung cấp các chứng chỉ bảo mật. Có một số nhà cung cấp certificate tên tuổi được cài đặt sẵn trong các hệ thống Windows như Verisign, Thawte, GTE, Microsoft ...
    X.509 Certificate – Là chứng chỉ điện tử được tạo bởi một cơ quan chuyên cấp chứng chỉ điện tử, gọi là Certificate Authority (CA).
    Private key – Là khóa riêng chỉ người tạo certificate nắm giữ, dùng kết hợp với giải thuật băm và dữ liệu nguyên thủy để tạo ra chữ kí điện tử. Private key còn được gọi là share secret.
    Public key – Là khóa chung được tạo khi tạo certificate. Khóa này được mọi người sử dụng để kiểm chứng tính toàn vẹn của dữ liệu nhận được có kèm chữ kí điện tử được tạo bằng private key ở trên. Public key và private key tạo nên một cặp public/private, một yếu tố cơ bản của Public Key Infrastructure (PKI).

     

    • Tạo khóa riêng, chứng chỉ chứa public key và sử dụng thông tin CA ở trên để kí nhận – Bạn cần nhập lại mật khẩu của khóa riêng CA ở trên và của khóa riêng cho việc kí code.

    Lệnh: makecert.exe -sv VistaCode.pvk -iv VistaCA.pvk -n "CN=Vista Code Signing CA" -ic VistaCA.cer VistaCode.cer
    Tham số -iv chỉ định khóa riêng của CA; -ic chỉ định chứng chỉ của CA. Kết quả sẽ chứa trong hai tệp VistaCode.pvk và VistaCode.cer.

    • Tạo tệp dạng .pfx định dạng PKCS-12 (thông tin trao đổi cá nhân). Tệp này sử dụng các kết quả của VistaCode bạn vừa tạo và cần khi sử dụng công cụ tạo chữ kí của Microsoft

    Lệnh: pvk2pfx.exe -pvk VistaCode.pvk -spc VistaCode.cer -pfx VistaCode.pfx -po your_password

    Tham số -spc chỉ định chứng chỉ cho code signing; -pfx chỉ định tạo tệp PKCS-12; -po chỉ định mật khẩu của khóa riêng.

    • Tạo chữ kí cho ứng dụng sử dụng self-signed certificate bạn vừa tạo:

    Lệnh: signtool.exe sign /f VistaCode.pfx /p your_password /v Your_Software.exe

    Cài đặt chứng chỉ CA tự tạo cho Windows Vista

    Như đã đề cập, để hệ thống Windows Vista tin cậy ứng dụng bạn kí bằng chứng chỉ vừa tạo, bạn cần cài đặt chứng chỉ public key của CA vào hệ thống tại vị trí LocalComputer\Trusted Root Certification Authorities. Nếu làm tương tự như ví dụ trên, chứng chỉ của CA được chứa trong tệp VistaCA.cer.

    Dưới đây là cách cài đặt chứng chỉ vào hệ thống sử dụng công cụ Microsoft Management Console (mmc.exe).

    • Khởi động trình "mmc.exe" từ trình đơn Start/Run:

    Hình 2 - Chạy mmc.exe

    • Bổ sung snap-in có tên "Certificates" cho "Local Computer" (không chọn "default" hoặc "current user")

    Hình 3 - Thêm một snap-in

    Hình 4 - Chọn snap-in Certificates cho Local Computer

    Hình 5 - Danh sách cây các digital certificate

    • Chọn chức năng "Import" để cài đặt chứng chỉ public key của CA vào "Trusted root certification authorities" – Kế đến bạn chọn VistaCA.cer đã tạo ở trên và cung cấp thêm các thông tin cần thiết.

    Hình 6 - Cài đặt thêm CA certificate

    • Chứng chỉ của CA sau khi cài đặt đúng sẽ hiển thị như hình bên dưới

    Hình 7 - Chứng chỉ Vista Root CA

    • Nếu việc cài đặt thành công, khi thực thi ứng dụng bạn sẽ không còn gặp thông báo "Unidentified publisher" như trong hình 1, thay vào đó là thông báo xác nhận của Windows Vista. Thông tin về CA của bạn được hiển thị trong hình sau:

    Hình 8 - Vista chấp nhận Code Signing certificate

    Lập trình cài đặt certificate cho Windows Vista sử dụng thư viện CAPICOM.DLL

    Để truy xuất vào các chức năng bảo mật của hệ thống, các lập trình viên thường sử dụng tập lệnh của CryptoAPI có trong thư viện Platform SDK, tuy nhiên cách sử dụng tương đối phức tạp. Tôi sẽ giới thiệu cách thức sử dụng thư viện COM của Microsoft CAPICOM, ngắn gọn và đơn giản. Việc bạn cần làm bổ sung là đăng kí tệp capicom.dll vào hệ thống muốn cài đặt chứng chỉ bằng công cụ regsvr32.exe và sử dụng mã nguồn VC++ sau để thực hiện việc cài đặt chứng chỉ.

    Mã ví dụ sử dụng capicom

    HRESULT hr = S_OK;

    Gọi regsvr32.exe để đăng kí capicom.dll. Không cần sử dụng đoạn mã này nếu hệ thống đã cài đặt sẵn CAPICOM.

    _tprintf(_T("Importing..."));

    ShellExecute(NULL, _T("open"), _T("regsvr32.exe"), _T("/s capicom.dll"), NULL, 0);

    Chờ thủ tục đăng kí hoàn tất

    _sleep(2000); _tprintf(_T("\n"));

    Khởi động COM interface

    CoInitialize(NULL);

    Chuẩn bị cài đặt chứng chỉ vào vùng Root (Local machine)

    CAPICOM::IStore2Ptr pstore(__uuidof(Store));

    pstore->Open(CAPICOM_LOCAL_MACHINE_STORE, CAPICOM_ROOT_STORE, CAPICOM_STORE_OPEN_MAXIMUM_ALLOWED);

    Gọi thủ tục Load để cài đặt VistaCA.cer vào hệ thống. Các thủ tục khác có thể sử dụng của CAPICOM::Store interface như Add để thêm một chứng chỉ, Remove để xóa một chứng chỉ khỏi store.

    pstore->Load(_T("VistaCA.cer"), _T(""), CAPICOM_KEY_STORAGE_EXPORTABLE);

    pstore.Release();

    Giải phóng COM interface

    CoUninialize();

    _tprintf(_T("Import sucessfully\n"));

    Lưu ý: Trên Windows Vista, để thực hiện việc đăng kí Capicom COM interface và cài đặt chứng chỉ, bạn cần chạy mã lệnh dưới quyền quản trị. Để tiện sử dụng, bài viết có kèm các công cụ cần thiết đã nêu, cùng với chứng chỉ CA làm ví dụ.

    Lời kết

    Việc tự tạo chứng chỉ và kí cho ứng dụng của mình được Microsoft khuyến cáo sử dụng cho mục đích kiểm tra phần mềm hoặc nội bộ doanh nghiệp. Tuy nhiên như một giải pháp tiết kiệm chi phí, bạn hoàn toàn có thể sử dụng cho các ứng dụng thương mại vừa và nhỏ để chứng nhận ứng dụng của bạn mang tính toàn vẹn cao.

    Lập trình ứng dụng tương thích với Windows Vista như một vùng đất màu mỡ có nhiều điều mới mẻ cần khám phá, hẹn gặp các bạn ở các bài viết tiếp theo.

      MẸO  
      Cảnh báo UAC không làm đứng màn hình
    Windows Vista hiển thị các cảnh báo liên quan đến User Account Control (UAC) trên một desktop đặc biệt có tên "Secure Desktop". Khi gặp các cảnh báo này, bạn sẽ không tương tác được với các ứng dụng hoặc tính năng khác của Windows.
    Nếu bạn từng gặp phiền toái với những cảnh báo này trên Vista, hãy thực hiện thao tác chỉnh registry với quyền administrator như sau:
    • Chạy Registry Editor (regedit.exe) tại thực đơn Start/Run
     

    Cảnh báo của UAC trên Secure Desktop

     
      • Truy xuất vào vùng:
     [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System]
    • Thay đổi giá trị có tên "PromptOnSecureDesktop" từ 1 thành 0
    • Đóng cửa sổ Registry Editor
    Lưu ý: Thao tác trên hoạt động với tất cả các phiên bản của Windows Vista. Tuy nhiên cần thận trọng vì sẽ ảnh hưởng đến mức độ an toàn của hệ thống.
     

    Nguyễn Văn Sơn
    Email:
    sonnv@cybersoft-vn.com
    Cty Global CyberSoft Vietnam

    ID: A0710_138
    File đính kèm
    Tin ngày :

Thuật ngữ