証明書セキュリティPKCS#12ファイルでPDFに証明書セキュリティを設定します。
秘密鍵と証明書のパッケージファイルであるPKCS#12ファイルを使い、PDFに証明書セキュリティを設定します。選択できる暗号化形式はX.509ファイルと同じです。*
PKCS#12ファイルを使用するためにはPKCS#12ファイルに設定されたパスワードが必要です。このパスワードはPKCS#12ファイルの作成時にファイルそのものに設定されるものです。
X.509ファイルと同じく、暗号化する際にユーザーアクセスフラグを設定し、権限を管理することができます。設定できる閲覧者の権限もX.509ファイルと同様です。*
PtlRecipient.setPKCS12()で受信者クラスにPKCS#12ファイルを設定します。
証明書セキュリティの設定以外の操作はX.509形式*と共通です。
サンプルプログラムでは、入力PDFに対して次のようにセキュリティ設定します。
package cookbook; import java.io.*; import jp.co.antenna.ptl.*; public class EncryptSetPubKeyWithPKCS12 { // そのクラスのusageを表示する関数 private static void printUsage() { System.out.print("usage: java EncryptSetPubKeyWithPKCS12 in-pdf-file out-pdf-file "); System.out.println("暗号化種類 PKCS12Pubkey-path password 印刷権限種類 変更権限 コピー可否 " + "アクセシビリティ有効の可否"); System.out.println("暗号化種類"); System.out.println("0 : 128 bit RC4 1 : 128 bit AES 2 : 256 bit AES"); System.out.println("印刷権限種類\n0 : 印刷不可 1 : 低解像度で可 2 : 高解像度で可"); System.out.println("変更権限種類"); System.out.println("0 : 許可しない"); System.out.println("1 : 注釈の作成、フォームフィールドの入力と既存の署名フィールドに署名を許可"); System.out.println("2 : ページの挿入、削除、回転を許可"); System.out.println("3 : フォームフィールドの入力と既存の署名フィールドに署名を許可"); System.out.println("4 : ページ抽出を除く全ての動作を許可"); System.out.println("コピー可否\n0 : コピーを許可しない 1 : コピーを許可する"); System.out.println("アクセシビリティの可否"); System.out.print("(スクリーンリーダーデバイスのテキストアクセス)を"); System.out.println("有効にするか"); System.out.println("0 : 有効にしない 1 : 有効にする"); } /** * @param args the command line arguments */ public static void main(String[] args) { if (args.length < 8) { printUsage(); return; } // コマンドライン引数の取得 int kind; String permPrint=""; String permModify=""; boolean permCopy; boolean permAccessibility; try { kind = Integer.parseInt(args[2]); switch (kind) { case 0: case 1: case 2: break; default: System.out.println("暗号化種類には、0から2の数値を指定してください。"); printUsage(); // usageメッセージの表示 return; } } catch(NumberFormatException numfe) { System.out.println("ERROR!!暗号化種類の文字形式が正しくありません。"); System.out.println("暗号化種類には、0から2の数値を指定してください。"); numfe.printStackTrace(); printUsage(); // usageメッセージの表示 return; } //印刷権限種類 try { permPrint = setPrintForPermType2(args[5]); } catch (IllegalArgumentException ex) { System.out.println(ex.getMessage()); printUsage(); // usageメッセージの表示 return; } //変更権限種類 try { permModify = setModifyForPermType2(args[6]); } catch (IllegalArgumentException ex) { System.out.println(ex.getMessage()); printUsage(); // usageメッセージの表示 return; } //コピー可否 try { permCopy = readBoolArgs(args[7], "コピー可否は" + "0か1で指定してください。"); } catch (IllegalArgumentException ex) { System.out.println(ex.getMessage()); printUsage(); // usageメッセージの表示 return; } try { permAccessibility = readBoolArgs(args[8], "アクセシビリティ有効の可否は、" + "0か1で指定してください。"); } catch (IllegalArgumentException ex) { System.out.println(ex.getMessage()); printUsage(); // usageメッセージの表示 return; } try (PtlParamInput inputFile = new PtlParamInput(args[0]); PtlParamOutput outputFile = new PtlParamOutput(args[1]); PtlParamInput pkcs12Pubkey = new PtlParamInput(args[3]); PtlPDFDocument doc = new PtlPDFDocument()) { String password = ""; if (args.length >= 5) { password = (String)args[4]; } // PDFファイルをロードします doc.load(inputFile); // PDFにPKCS#12形式の証明書を設定します switch (kind) { case 0: // 128 bit RC4 System.out.println("128bit RC4で暗号化します。"); encryptPKCS12Pubkey128RC4(doc, pkcs12Pubkey, password, permPrint, permModify, permCopy, permAccessibility); break; case 1: // 128 bit AES System.out.println("128bit AESで暗号化します。"); encryptPKCS12Pubkey128AES(doc, pkcs12Pubkey, password, permPrint, permModify, permCopy, permAccessibility); break; case 2: // 256 bit AES System.out.println("256bit AESで暗号化します。"); encryptPKCS12Pubkey256AES(doc, pkcs12Pubkey, password, permPrint, permModify, permCopy, permAccessibility); break; } // ファイルに保存します doc.save(outputFile); } ...【GetPDFVersion.javaと同じ処理のため省略 ・エラーメッセージ処理と出力】... } private static void encryptPKCS12Pubkey128RC4(PtlPDFDocument doc, PtlParamInput pkcs12Pubkey, String password, String permPrint, String permModify, boolean permCopy, boolean permAccessibility) throws PtlException, IOException, Exception, Error { try(PtlEncryptPubKey128RC4 encPubkey128RC4 = new PtlEncryptPubKey128RC4()) {//256ビットAES暗号化された公開キーセキュリティハンドラを表すクラス encryptPKCS12Pubkey(doc, pkcs12Pubkey, encPubkey128RC4, password, permPrint, permModify, permCopy, permAccessibility); } } private static void encryptPKCS12Pubkey128AES(PtlPDFDocument doc, PtlParamInput pkcs12Pubkey, String password, String permPrint, String permModify, boolean permCopy, boolean permAccessibility) throws PtlException, IOException, Exception, Error { try(PtlEncryptPubKey128AES encPubkey128AES = new PtlEncryptPubKey128AES()) {//256ビットAES暗号化された公開キーセキュリティハンドラを表すクラス encryptPKCS12Pubkey(doc, pkcs12Pubkey, encPubkey128AES, password, permPrint, permModify, permCopy, permAccessibility); } } private static void encryptPKCS12Pubkey256AES(PtlPDFDocument doc, PtlParamInput pkcs12Pubkey, String password, String permPrint, String permModify, boolean permCopy, boolean permAccessibility) throws PtlException, IOException, Exception, Error { try(PtlEncryptPubKey256AES encPubkey256AES = new PtlEncryptPubKey256AES()) {//256ビットAES暗号化された公開キーセキュリティハンドラを表すクラス encryptPKCS12Pubkey(doc, pkcs12Pubkey, encPubkey256AES, password, permPrint, permModify, permCopy, permAccessibility); } } private static void encryptPKCS12Pubkey(PtlPDFDocument doc, PtlParamInput pkcs12Pubkey, PtlEncryptPubKey encPubkey, String password, String permPrint, String permModify, boolean permCopy, boolean permAccessibility) throws PtlException, IOException, Exception, Error { try(PtlRecipients recipients = encPubkey.getRecipients(); //証明書受信者のコンテナを表したクラス PtlRecipient recipient = new PtlRecipient(); //証明書の受信者を表したクラス PtlEncryptPermissionPubKey permission = new PtlEncryptPermissionPubKey()) { //受信者クラスにPKCS#12形式の証明書を設定 recipient.setPKCS12(pkcs12Pubkey, password); //受信者クラスにユーザーアクセス許可フラグを設定 // 印刷権限の設定 // PERM_PRINT_NOT_ALLOWED : 許可しない permission.setPrint(PtlEncryptPermissionType2.PERMISSION_PRINT.valueOf(permPrint)); // 変更権限の設定 // PERM_MODIFY_NOT_ALLOWED : 許可しない permission.setModify(PtlEncryptPermissionType2.PERMISSION_MODIFY.valueOf(permModify)); // テキスト、画像、その他の内容のコピーを有効にするかどうかの設定 // false : 有効にしない permission.setCopy(permCopy); // スクリーンリーダーデバイスのテキストアクセスを有効にするかどうかの設定 // false : 有効にしない permission.setAccessibility(permAccessibility); //設定したユーザーアクセスフラグを設定する recipient.setPermission(permission); //受信者コンテナのクラスに受信者クラスを追加 recipients.append(recipient); //以下は標準セキュリティハンドラと共通の設定 //すべてのコンテンツを暗号化する encPubkey.setEncryptComponent(PtlEncrypt.ENCRYPT_COMPONENT.ENCRYPT_ALL); // 設定したセキュリティハンドラを用いてPDFを暗号化 doc.setEncrypt(encPubkey); } } public static String setPrintForPermType2(String permPrintArg) throws IllegalArgumentException { ...【EncryptSetPubKeyWithX509.javaと同じ処理のため省略 ・印刷権限を表す列挙型定数名を指定をする関数】... } public static String setModifyForPermType2(String permModifyArg) throws IllegalArgumentException { ...【EncryptSetPubKeyWithX509.javaと同じ処理のため省略 ・変更権限を表す列挙型定数名を指定をする関数】... } /** * 0または1を入力されたargsにより、trueまたはfalseを返すメソッド。 * * @param args 与えられるコマンドライン引数。0または1でtrueまたはfalseを指定する。 * @param errorMessage argsが0か1でなかった場合に出力されるエラーメッセージを指定する。 * @return argsの数値を読み取った結果を戻す * @throws java.lang.IllegalArgumentException argsが0か1でなかった場合に発生。 */ public static boolean readBoolArgs(String args, String errorMessage) throws IllegalArgumentException { ...【FixUpPDFASetSaveOption.javaと同じ処理のため省略 ・0または1を読み取り、boolean型のfalseまたはtrueを返す関数】... } }
EncryptSetPubKeyWithPKCS12.java
C:\samples>java cookbook.EncryptSetPubKeyWithPKCS12 usage: java EncryptSetPubKeyWithPKCS12 in-pdf-file out-pdf-file 暗号化種類 PKCS12Pubkey-path password 印刷権限種類 変更権限 コピー可否 アクセシビリティ有効の可否 暗号化種類 0 : 128 bit RC4 1 : 128 bit AES 2 : 256 bit AES 印刷権限種類 0 : 印刷不可 1 : 低解像度で可 2 : 高解像度で可 変更権限種類 0 : 許可しない 1 : 注釈の作成、フォームフィールドの入力と既存の署名フィールドに署名を許可 2 : ページの挿入、削除、回転を許可 3 : フォームフィールドの入力と既存の署名フィールドに署名を許可 4 : ページ抽出を除く全ての動作を許可 コピー可否 0 : コピーを許可しない 1 : コピーを許可する アクセシビリティの可否 (スクリーンリーダーデバイスのテキストアクセス)を有効にするか 0 : 有効にしない 1 : 有効にする C:\samples>java cookbook.EncryptSetPubKeyWithPKCS12 testPages_10.pdf Output_EncryptSetPubKeyWithPKCS12.pdf 2 testPKCS12.pfx testtest 0 0 1 0 256bit AESで暗号化します。 -- 完了 --
暗号化された出力PDFを閲覧するには、暗号化に使用したPKCS#12ファイルとPKCS#12ファイルに設定したパスワードによる認証が必要です(図 6.3)。サンプルに添付のPKSC#12ファイルのパスワードは“testtest”です。認証画面はX.509ファイルでセキュリティを設定したものと同様です。
また、PDFの権限設定はコピーとスクリーンリーダーのアクセス(アクセシビリティ向けのテキスト読み取り)を許可、それ以外を全て不許可にしています。