証明書セキュリティにおいて証明書セキュリティすべての権限を許可するユーザーアクセスフラグを設定します。
証明書を用いたPDFの暗号化の際、暗号化の解除を含むすべての権限を許可するユーザーアクセスフラグを設定します。
PtlEncryptPermissionPubKey.setFullPermission()でtrueに設定すると、ユーザーアクセスフラグの2ビット目がONとなり、その設定をされた受信者にはセキュリティの解除を含む全権が与えられます。
言い換えると、証明書セキュリティが施されたPDFをすべての権限を許可をした受信者の秘密鍵で開くと、そのPDFでは暗号化情報の解除を含むすべての操作が可能になります。逆に、すべての権限を許可した受信者を登録せずにPDFを暗号化すると、PDFのセキュリティを解除する方法が無くなってしまいます。
管理者用に作成した証明書を用いてすべての権限を許可した受信者と、閲覧者用のユーザーアクセスフラグを設定した受信者をそれぞれ登録します。
こうすることで、管理者用の秘密鍵でPDFを開いた場合にのみ権限の変更やセキュリティの解除ができるようにします。閲覧者用の秘密鍵でPDFを開いた場合には許可した権限だけが可能になっています。
サンプルプログラムでは、X.509証明書を用いて暗号化する際にすべての権限を許可するユーザーアクセスフラグを設定するか、しないかを設定できます。
すべての権限を許可しなかった場合、入力されたX.509証明書のアクセス権限はデフォルト設定となります。
デフォルト設定ではアクセス権限は以下のように設定されます。
package cookbook; import java.io.*; import jp.co.antenna.ptl.*; public class EncryptSetPubKeySetFullPermission { // そのクラスのusageを表示する関数 private static void printUsage() { System.out.print("usage: java EncryptSetPubKeyWithX509 in-pdf-file out-pdf-file "); System.out.println("暗号化種類 X509Pubkey-path set-full-permission"); System.out.println("暗号化種類"); System.out.println("0 : 128 bit RC4 1 : 128 bit AES 2 : 256 bit AES"); System.out.println("set-full-permission"); System.out.println("0 : デフォルトのアクセス権限を設定する。 1 : 全ての権限を許可する"); } /** * @param args the command line arguments */ public static void main(String[] args) { if (args.length < 4) { printUsage(); return; } // コマンドライン引数の取得 int kind; boolean setFullPerm; 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 { setFullPerm = readBoolArgs(args[4], "set-full-permissionは" + "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 x509Pubkey = new PtlParamInput(args[3]); PtlPDFDocument doc = new PtlPDFDocument()) { // PDFファイルをロードします doc.load(inputFile); // PDFにX.509形式の証明書を設定します switch (kind) { case 0: // 128 bit RC4 System.out.println("128bit RC4で暗号化します。"); encryptX509PubkeySetFullPerm128RC4(doc, x509Pubkey, setFullPerm); break; case 1: // 128 bit AES System.out.println("128bit AESで暗号化します。"); encryptX509PubkeySetFullPerm128AES(doc, x509Pubkey, setFullPerm); break; case 2: // 256 bit AES System.out.println("256bit AESで暗号化します。"); encryptX509PubkeySetFullPerm256AES(doc, x509Pubkey, setFullPerm); break; } // ファイルに保存します doc.save(outputFile); } ...【GetPDFVersion.javaと同じ処理のため省略 ・エラーメッセージ処理と出力】... } private static void encryptX509PubkeySetFullPerm128RC4(PtlPDFDocument doc, PtlParamInput x509Pubkey, boolean setFullPerm) throws PtlException, IOException, Exception, Error { try(PtlEncryptPubKey128RC4 encPubkey128RC4 = new PtlEncryptPubKey128RC4()) {//256ビットAES暗号化された公開キーセキュリティハンドラを表すクラス encryptX509PubkeySetFullPerm(doc, x509Pubkey, encPubkey128RC4, setFullPerm); } } private static void encryptX509PubkeySetFullPerm128AES(PtlPDFDocument doc, PtlParamInput x509Pubkey, boolean setFullPerm) throws PtlException, IOException, Exception, Error { try(PtlEncryptPubKey128AES encPubkey128AES = new PtlEncryptPubKey128AES()) {//256ビットAES暗号化された公開キーセキュリティハンドラを表すクラス encryptX509PubkeySetFullPerm(doc, x509Pubkey, encPubkey128AES, setFullPerm); } } private static void encryptX509PubkeySetFullPerm256AES(PtlPDFDocument doc, PtlParamInput x509Pubkey, boolean setFullPerm) throws PtlException, IOException, Exception, Error { try(PtlEncryptPubKey256AES encPubkey256AES = new PtlEncryptPubKey256AES()) {//256ビットAES暗号化された公開キーセキュリティハンドラを表すクラス encryptX509PubkeySetFullPerm(doc, x509Pubkey, encPubkey256AES, setFullPerm); } } private static void encryptX509PubkeySetFullPerm(PtlPDFDocument doc, PtlParamInput x509Pubkey, PtlEncryptPubKey encPubkey, boolean setFullPerm) throws PtlException, IOException, Exception, Error { try(PtlRecipients recipients = encPubkey.getRecipients(); //証明書受信者のコンテナを表したクラス PtlRecipient recipient = new PtlRecipient(); //証明書の受信者を表したクラス PtlEncryptPermissionPubKey permission = new PtlEncryptPermissionPubKey()) { //すべての編集権限を与えるかどうかを設定 permission.setFullPermission(setFullPerm); //受信者クラスにX.509形式の証明書を設定 recipient.setX509(x509Pubkey); //受信者クラスにアクセス許可フラグを設定 recipient.setPermission(permission); //受信者コンテナのクラスに受信者クラスを追加 recipients.append(recipient); //以下は標準セキュリティハンドラと共通の設定 //すべてのコンテンツを暗号化する encPubkey.setEncryptComponent(PtlEncrypt.ENCRYPT_COMPONENT.ENCRYPT_ALL); // 設定したセキュリティハンドラを用いてPDFを暗号化 doc.setEncrypt(encPubkey); } } /** * 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を返す関数】... } }
EncryptSetPubKeySetFullPermission.java
C:\samples>java cookbook.EncryptSetPubKeySetFullPermission usage: java EncryptSetPubKeyWithX509 in-pdf-file out-pdf-file 暗号化種類 X509Pubkey-path set-full-permission 暗号化種類 0 : 128 bit RC4 1 : 128 bit AES 2 : 256 bit AES set-full-permission 0 : デフォルトのアクセス権限を設定する。 1 : 全ての権限を許可する C:\samples>java cookbook.EncryptSetPubKeySetFullPermission testPages_10.pdf Output_EncryptSetPubKeySetFullPermission.pdf 2 antennaJirouX509.cer 1 256bit AESで暗号化します。 -- 完了 --
この操作例で、出力PDFはすべての権限を許可されていますが同時に暗号化もされているため、開くには対応するPKCS#12証明書ファイルを使ったパスワード認証が必要です。
PDFを開いた後にセキュリティ設定を削除することができます。
また、印刷・文書の変更・コピー・アクセシビリティ向けテキスト読み取りのすべての権限が許可されていることも確認できます。
すべての権限が許可されていない証明書セキュリティが設定されたPDFでは、PDFを開いた後にセキュリティを解除することはできません。
下図は「6.1.1証明書によるセキュリティ設定(X.509形式)」で権限に制限のある証明書セキュリティを設定して出力したPDFを開いた状態です。「セキュリティ設定を削除」がグレーアウトして選択不能になっていることが分かります。