========================================            PKI基本ライブラリ LE:PKI:Lib             Ver 1.09.R1版 「最初にお読みください」           有限会社ラング・エッジ 2024年08月19日 ======================================== ■ 最初にお読みください 本ドキュメントは、有限会社ラング・エッジが開発した以下のPKIライブラリについての 全体の説明をするファイルです。 ・PKI基本ライブラリ LE:PKI:Lib   CAdES/PKCS#7の署名データ生成やTimeStamp取得と証明書等のPKI(公開鍵基盤)基本   機能を提供する基本ライブラリです。 ■ 主な機能(クラス構成) ・LePKI : 基本クラス、証明書/パスの検証や独自証明書ストアの管理等を行う。 ・LpkCert : X.509証明書操作クラス(PKCS#12/PKCS#11にも対応) ・LpkCrl : 証明書失効リスト(CRL)操作クラス ・LpkOcsp : オンライン証明書ステータスプロトコル(OCSP)操作クラス ・LpkCades : CMS長期署名データ操作クラス(署名付与)※ CAdES-Tまで対応 ・LpkPkcs7 : PKCS#7(CMD)署名データ操作クラス(署名付与) ・LpkTimestampToken : RFC 3161タイムスタンプトークン操作クラス ・LpkTimestamp : RFC 3161タイムスタンプ取得基本クラス(LpkTs3161/LpkTsAmano)   LpkTs3161 : RFC 3161タイムスタンプ取得クラス(Basic認証/セイコー対応)   LpkTsAmano : アマノタイムスタンプサービスのタイムスタンプ取得クラス ※ ・LpkUtil : PKI補助機能クラス(TSインスタンス生成、CRL/OCSP/証明書の取得) ※ アマノタイムスタンプサービス用のソースコードは非公開です。 ■ ドキュメント説明 readme-LePKI.txt : 全体に関する説明ファイル。本ファイル。 doc/LePKI/cmd/*-help.txt : コマンドラインの利用方法のヘルプファイル。 doc/LePKI/cpp/index.html : CPPのAPIリファレンスファイル。 doc/LePKI/java/index.html : JavaのAPIリファレンスファイル。 doc/LePKI-manual.pdf : LE:PAdES:Libの製品マニュアル(エラーコード)。 ■ フォルダ構成 1)LE:PKI:Libを利用するのに必要なフォルダ // Windows版 bin_win : 実行ファイル(Windows用) 必要なDLLファイルやコマンドが入っている。※1 lib_win : リンクライブラリ(Windows用) この下へライブラリパスを通す。※1 // Linux版 bin_linux : 実行ファイル(Linux用) 実行スクリプト LpkCmd.sh が入っている。 lib_linux : リンクライブラリ(Linux用) 必要なsoファイル等が入っている。※2 // 共通 include : インクルードフォルダ この下へインクルードパスを通す。※3 java/lib : Java用のライブラリフォルダ。※4 ※1 Windows環境用は更に以下のサブフォルダに分かれている。    Release : Windows 32bit リリース版    Release64 : Windows 64bit リリース版    Debug : Windows 32bit デバッグ版    Debug64 : Windows 64bit デバッグ版 ※2 Linux環境でC++/Javaから使う場合には、lib_linux に対して LD_LIBRARY_PATH    環境変数をセットするか、lib_linux の中にあるファイルを標準のライブラリ    ディレクトリ(/usr/lib 等)にコピーをする必要がある。    詳細は製品マニュアルを参照。 ※3 C++のAPIを利用しないなら不要 ※4 JavaのAPIを利用しないなら不要 2)LE:PKI:Libを利用する際の参考または参照する為のフォルダ doc : マニュアルファイルやAPIリファレンス用フォルダ。 sample : コマンド/C++/Javaの利用サンプル用フォルダ。 license : フリーライブラリのライセンス用フォルダ。 3)LE:PKI:Libをビルドするのに必要なフォルダ // 共通 src : LE:PKI:Libビルド用ソースフォルダ local : フリーライブラリ用フォルダ java : Java用のソースとビルド用フォルダ // Windows版のみ dotnet : .NET用のソースとビルド用フォルダ(DLLファイルはbin_winの下) ■ 利用サンプル // コマンドコマンド sample/LePKI/cmd : LpkCmdによるサンプルスクリプト CmdSignTest.bat / CmdSignTest.sh : 署名サンプル実行スクリプト CmdVerifyTest.bat / CmdVerifyTest.sh : 検証サンプル実行スクリプト // C++サンプル sample/LePKI/cpp : C++のAPI実装によるサンプルソース CppBuild.bat / CppBuild.sh : C++サンプルビルド用スクリプト CppSignTest.bat / CppSignTest.sh : 署名サンプル実行スクリプト CppVerifyTest.bat / CppVerifyTest.sh : 検証サンプル実行スクリプト // Javaサンプル sample/LePKI/java : JavaのAPI実装によるサンプルソース JavaBuild.bat / JavaBuild.sh : C++サンプルビルド用スクリプト JavaSignTest.bat / JavaSignTest.sh : 署名サンプル実行スクリプト JavaVerifyTest.bat / JavaVerifyTest.sh : 検証サンプル実行スクリプト // サンプル用環境 sample/LePKI/LeTest.p12 : サンプル実行用の証明書(PKCS#12/パスワード"test") sample/LePKI/store/ : サンプル用の証明書ストアディレクトリ ■ 更新履歴 Ver1.09.R1版 : 2024-08-19 ・OCSPの失効日時の取得に失敗して常に現在時刻での失効確認になっていた問題の修正。 ・OCSP優先時でも埋め込みか外部から提供されたCRLをまずチェックするように仕様変更。 ・CRL優先時でも埋め込みか外部から提供されたOCSPをまずチェックするように仕様変更。 ・PKCS#11の署名時に例外になる箇所があり修正した。 ・CRLへの署名証明書の認証パス構築に間違いがあったので修正した。  この問題はCRL用の署名証明書を別にした場合にのみ問題があった。 ・ECDSA(楕円曲線暗号)の署名と検証にベータ対応した。  ただしベータ版につきPKCS#11の署名は非対応、OCSP/CVSによる検証は動作未確認。  ECDSA対応に伴い以下APIを追加。  LpkCert::getKeyAlg() // 証明書の公開鍵方式をLPK_RSAかLPK_ECDSAで返す  LpkCades::getSignType() // CAdESの署名方式をLPK_SIGNで返す  LpkPkcs7::getSignType() // PKCS#7の署名方式をLPK_SIGNで返す ・検証時のオプションフラグとしてCVS(証明書検証サーバー)向け機能を2つ追加。  LPKV_OPT_USECVS: CVSで検証済みの検証処理をおこなう ※1  LPKV_OPT_USECONSTR: 証明書の基本制約とCRL/ARLのチェックをおこなう ※2  ※1 LPKV_OPT_USECVSはCRLへの署名証明書の公開鍵が一致しない場合であっても    Issuerが一致すれば検証する等の処理をおこなう為のフラグ。CVSの場合には    CRLの認証パスまでは返さない為の措置であり通常は指定しないことを推奨。    CVS検証結果を使う時のみ利用する。  ※2 LPKV_OPT_USECONSTRはCVS等でCRL/ARLが混在して返される場合に正しいもの    を識別して利用する為のフラグ。CVS利用に限らずARLを正しく識別して利用    したい場合に利用する。 Ver1.08.R3a版 : 2024-03-04 ・タイムスタンプリクエストのNonceの1バイト目を0x04固定とした。  Nonceの1バイト目が 0x00 or 0xFF の場合に処理できない他社実装がある為。 Ver1.08.R3版 : 2024-01-22 ・OpenSSLを3.1.1にしたことで一部のPKCS#7署名の検証に失敗していた問題の修正。 ・OpenSSLを3.1.1にしたことで一部のタイムスタンプの情報取得に失敗していた問題の修正。 ・Windows版の認証付きプロキシ環境でWinHTTP(デフォルト)を使った場合にエラーになり  通信できない問題の修正。現在Basic認証のみサポート。NTLM/PASSPORT/DIGEST等の認証が  必要な場合にはご連絡ください。 ・LE:PKI:Libマニュアルの更新。 Ver1.08.R2版 : 2023-10-27 ・OpenSSLを3.1.1にしたことで属性証明書を含むタイムスタンプトークンの検証に失敗を  していた問題の修正。なおOpenSSLの修正となる。 ・証明書にV_ASN1_BMPSTRING(UTF-16BE)が使われていた場合に情報取得に失敗をする問題  の修正。 ・証明書にDN形式のCRLDPがある時にLPKV_NOUSE_LDAPを指定してもCRL取得しようとする  問題の修正。DN形式のCRLDPはGPKI証明書等で使われている。 ・OpenSSLの3.1.1完全移行に向けてOpenSSLレガシーAPIの利用停止。 Ver1.08.R1版 : 2023-08-30 ・Ver1.08.R1はメジャーバージョンアップとなり2箇所の仕様変更があるので注意。  Windows版の実行時に LePKI.dll だけで良く他のDLLは不要になった。  ※ 必要なライブラリは全てスタティックリンクするようになった。  ※ ただしJava利用時には LePKIjni.dll が必要。  ※ ただし.NET利用時には LePKIdnet.dll が必要。 ・検証時の優先をCRLからOCSPへ変更した。※注意:仕様変更1、Windows版Linux版共通  優先とは証明書にCRLDPとOCSPのURLがある場合にどちらを先に使うかの指定と言う意味。  従来デフォルトでは先にCRLをチェックして次にOCSPをチェックしていた。  今後デフォルトでは先にOCSPをチェックして次にCRLをチェックするようになった。  従来通りCRL優先としたい場合には以下の対応が必要となる。  API利用時:検証オプション LPKV_PRIOR_CRL を指定する。  ※ LPKV_PRIOR_OCSP の指定も可能だが LPKV_PRIOR_CRL の指定が優先される。  コマンド利用時:引数 -prior crl を指定する。  ※ 従来の -prior ocsp を指定してもエラーにはならない。 ・Windows版のLePKIからのHTTP通信の標準をWinInetからWinHTTPに変更した。※注意:仕様変更2  WinHTTPはWindows Updateで使われているHTTP通信方式。  従来通り WinInet を使う場合は以下のAPI引数の htype に LPK_HTTP_WININET を指定する。  ※ LePKI.setHttp() と LpkTimestamp.setHttp() は新しく追加されたAPI。   LePKI.setHttp(LPK_HTTP_TYPE htype); // 検証時のCRL/OCSP取得のHTTP方式の指定   LpkTimestamp.setHttp(LPK_HTTP_TYPE htype); // タイムスタンプ取得時のHTTP方式の指定   LpkUtil.getCrl(..., LPK_HTTP_TYPE htype); // CRL取得時のHTTP方式の指定   LpkUtil.getOcsp(..., LPK_HTTP_TYPE htype); // OCSP取得時のHTTP方式の指定   LpkUtil.getOcsp2(..., LPK_HTTP_TYPE htype); // 独自OCSP取得時のHTTP方式の指定   LpkUtil.getCvs(..., LPK_HTTP_TYPE htype); // CVS検証結果取得時のHTTP方式の指定  LpkCmd では引数 -http inet を指定することで従来と同じWinInetの利用が可能。 ・Windows版のLePKIからのHTTP通信にてLinux版と同じSocket+OpenSSLの指定が可能となった。  API利用時には LPK_HTTP_SOCKET を指定、コマンド利用時には -http sock を指定。  ※ プロキシ設定 proxy.ini は実行モジュール(LpaCmd.exe等)と同じか C:\Temp 下から読み込む。  ※ Linux版では従来通り LPK_HTTP_SOCKET のみサポートとなり他の指定は不可となっている。 ・OpenSSLの1.1.1のサポートが2023年9月11日で終了の為に3.1.1に更新した。  https://www.openssl.org/blog/blog/2023/03/28/1.1.1-EOL/ ・Visual Studio 2022 に対応した。src/LePAdES2022.sln にてリビルドが可能。  ※ Visual Studio 2010/2012 はマイクロソフトのサポート期限切れにつき未サポートとなった。    サポートする Visual Studio は、2013/2015/2017/2019/2022 となった。 ・検証時に署名証明書認証パスのトラストアンカー指定 rootCert が指定可能となった。  証明書検証サーバー(CVS)等で取得した検証情報を利用する場合等に指定する。  CVSの場合はCVS取得時指定のトラストアンカーと同じ証明書をverifyの引数に指定する。  LpaCmdでは引数 -root 証明書ファイル.cer で指定が可能。  もしルート証明書がトラストアンカーと異なる場合には従来通りの認証パス構築となる。 ・PKCS#7署名の検証に失敗することがあったので修正した。  DigestInfoのPARAMETERS NULLが無い場合にOpenSSL1.1.1で検証できなかった問題。 ・CRL取得がシングルスレッド実行されていた為にCRL取得のタイムアウトがあった場合に  他のCRL取得が出来ない問題の修正。 Ver1.07.R2版 : 2021-05-06 ・Windows版にてICカード設定を指定できる LpkCert::setCard2() を追加。  setCard2()で設定するとカード種別は LPK_CT_SPEC となるが、設定XMLに  情報を保存したり読み込んだりすることは出来ない。 /** ICカード証明書指定V2(Windows環境のみ)\n\n * パラメータ指定してICカードを利用する * * @param provName [IN] プロバイダ名を指定 * @param provType [IN] プロバイダ種別を指定(PROV_RSA_FULL/PROV_RSA_AES等) * @param provFlag [IN] プロバイダフラグを指定(CRYPT_SILENT等) * @param keyType [IN] 鍵種別を指定(AT_SIGNATURE[2]/AT_KEYEXCHANGE[1]等) * @param chain [IN] ICカードのCA証明書や証明書チェーンの取得 * @retval マイナス値 エラーコードが返る */ int setCard2(const CHAR* provName, int provType, int provFlag=0, int keyType=2, bool chain=false); ・互換性向上の為に一部のCAdESデータ仕様(標準的では無いPKCS#7的な形式)への対応。 Ver1.07.R1版 : 2021-01-15 ・Windows版で実行時に libxml2.dll と zlib1.dll が不要になった。  ※ スタティックリンクによる組み込みに変更した為。 ・Visual Studio 2017/2019 のビルドに対応した。  ※ 現在 Visual Studio 2010/2012/2013/2015/2017/2019 に対応済み。 ・LpkCertに商業登記証明書の登記事項等を取得するgetRegisteredInfo()を追加。 ・LpkCertに公的個人証明書(JPKI)の登録事項を取得するgetJpkiInfo()を追加。 ・LpkCertのgetInfo()の引数に英語情報で返すenglishを追加。 ・LePKIに証明書検証を行うverifyCert()/resultCert()/reportCert()を追加。  verifyCert() : 引数で与えられた証明書の検証を行い検証結果XMLを返す。  resultCert() : 検証結果XMLから検証結果(VALID/INDETERMINATE/INVALID)を返す。  reportCert() : 検証結果XMLから分かりやすいレポート形式文字列を生成して返す。 ・LpkCertの証明書読み込み時にバイナリ(DER)で失敗した後でPEMで読み込みする  ように変更した。これでPEM形式の証明書も読み込めるようになった。 Ver1.06.R2版 : 2019-02-01 ・LpkCmdによるタイムスタンプ取得と検証時に対象となるファイルを逐次読み込みする  ことで大きなファイルにも対応しました。 ・LpkCmdのタイムスタンプ検証時の実行範囲オプション -tflag を追加しました。 -tflag : タイムスタンプ検証フラグ all : 全ての検証を行う(標準設定/-target引数必須) none : 検証しない(-tstオプションで情報のみ取得) sign : トークンのTSA証明書による署名を検証 hash : ハッシュ値を比較(-target引数必須) cert : TSA証明書のPKI検証 ・LpkCmdのタイムスタンプ検証時にタイムスタンプトークンから情報を取得するオプ  ション -tst / -tsa を追加しました。 -tst