PKCS12のJavaキーストアの使用に関するガイドライン

Oracle NoSQL Databaseでは、PKCS12形式のJavaキーストアがサポートされています。22.1リリース以降、NoSQL Databaseでは、makebootconfigまたはsecurityconfigユーティリティによって作成されるデフォルトのセキュリティ構成のキーストア・タイプがPKCS12に切り替わっています。

ノート:

既存のセキュリティ構成のキーストア形式を、業界標準の形式であるPKCS12に切り替えることをお薦めします。

デフォルトのセキュリティ構成

リリース22.1以降のデフォルトのセキュリティ構成では、データベース・サーバーのキーストアおよびトラストストア(通常はそれぞれstore.keysおよびstore.trustという名前)はPKCS12形式で作成され、-kspwdを使用して指定したパスワードによって保護されます。

クライアント・アプリケーションで使用されるトラストストアであるclient.trustは、-ctspwdを使用してパスワードを指定しないと、デフォルトで、PKCS12形式でパスワードなしで作成されます。また、構成ユーティリティの実行に使用されるJavaでパスワード不要PKCS12ストアがサポートされていない場合は、ユーティリティによって、JKS形式でclient.trustが作成されるようにフォールバックされます。パスワード不要PKCS12がサポートされているJavaバージョンでは、セキュリティ・プロパティkeystore.pkcs12.certProtectionAlgorithmおよびkeystore.pkcs12.macAlgorithmが使用可能になっている必要があります。この機能に必要な最小バージョンのJAVAは、JAVA 8の場合はJDK 8u301、JAVA 11の場合はJDK 11.0.12、およびJAVA 17の場合は最初のリリースです。

構成の作成時に、client.trustをPKCS12形式で作成し、-ctspwdを使用して指定したパスワードによって保護できます。パスワードで保護されたclient.trustを使用している場合は、ログイン・プロパティ・ファイル内でパスワードを指定する必要があります。次の2つのログイン・プロパティがサポートされています。
  • oracle.kv.ssl.trustStorePassword
  • oracle.kv.ssl.trustStorePasswordAlias

クライアント・アプリケーションで、ログイン・プロパティ・ファイル内でoracle.kv.ssl.trustStorePasswordプロパティを使用してパスワードを指定するか、外部パスワード・ストレージにパスワードを格納しoracle.kv.ssl.trustStorePasswordAliasプロパティを使用してその別名のみを指定できます。

例:
#Security property settings for communication with KVStore servers using password
oracle.kv.ssl.trustStore=client.trust
oracle.kv.ssl.trustStoreType=PKCS12
oracle.kv.ssl.trustStorePassword=<client.trust password>
oracle.kv.ssl.protocols=TLSv1.3,TLSv1.2
oracle.kv.ssl.hostnameVerifier=dnmatch(CN\=NoSQL)
oracle.kv.transport=ssl

#Security property settings for communication with KVStore servers using password alias
oracle.kv.ssl.trustStore=client.trust
oracle.kv.ssl.trustStoreType=PKCS12
oracle.kv.ssl.trustStorePasswordAlias=cts
oracle.kv.ssl.protocols=TLSv1.3,TLSv1.2
oracle.kv.ssl.hostnameVerifier=dnmatch(CN\=NoSQL)
oracle.kv.transport=ssl
oracle.kv.auth.wallet.dir=<wallet_directory>
oracle.kv.auth.username=<user_name>

既存のセキュリティ構成のキーストア・タイプの更新

NoSQL Databaseリリース22.1より前のリリースで作成されたセキュリティ構成では、すべてのJavaキーストアがJKS形式で生成されます。JavaキーストアをPKCS12形式にアップグレードするには、次の手順を実行する必要があります。

  1. NoSQL Databaseストレージ・ノードの1つから既存のセキュリティ構成ディレクトリをコピーします。
  2. 次のコマンドを実行してキーストアをPKCS12形式に更新します。
    java -jar kvstore.jar securityconfig config update -secdir <security dir> -kstype PKCS12 [-ctspwd <client.trust password>]
    このコマンドでは、NoSQL Databaseサーバーで使用される既存のキーストア(store.keys)およびトラストストア(store.trust)がPKCS12形式に変換され、既存の構成内のストアのキーストア・パスワードが再使用されます。構成の作成と同様に、このコマンドでも、-ctspwdを使用してパスワードを指定しないとパスワード不要の新しいclient.trustがPKCS12形式で作成されます。Javaでパスワード不要PKCS12ストアがサポートされていない場合は、JKS形式のclient.trustの作成にフォールバックされます。
  3. セキュリティ構成表示コマンドを実行して、ストア・タイプがPKCS12形式に更新されていることを確認します。
    java -jar kvstore.jar securityconfig config show -secdir security
         Security parameters:
         certMode=shared
         internalAuth=ssl
         keystore=store.keys
         keystorePasswordAlias=keystore
         keystoreType=PKCS12
         securityEnabled=true
         truststore=store.trust
         truststoreType=PKCS12
         walletDir=store.wallet
         
         internal Transport parameters:
         ...
         Keystore: security/store.keys
         Keystore type: PKCS12
         Keystore provider: SUN
    
         Your keystore contains 1 entry
    
         shared, Feb 11, 2022, PrivateKeyEntry,
         Certificate fingerprint (SHA-256): AA:98:B8:C6...
    
         Keystore: security/store.trust
         Keystore type: PKCS12
         Keystore provider: SUN
    
         Your keystore contains 1 entry
    
         mykey, Feb 11, 2022, trustedCertEntry,
         Certificate fingerprint (SHA-256): AA:98:B8:C6...
  4. 構成ディレクトリ内に、名前に.oldという接尾辞が付いた、各Javaキーストアのバックアップがあることを確認します。
    ls kvroot/security
         store.wallet
         store.trust.old
         store.trust
         store.keys.old
         store.keys
         security.xml
         client.trust.old
         client.trust
         client.security
  5. 基本ログイン・プロパティ・ファイルclient.securityがPKCS12形式に更新されていることを確認します。
    cat security/client.security
         #Security property settings for communication with KVStore servers
         #Fri Feb 11 10:59:39 PST 2022
         oracle.kv.ssl.trustStore=client.trust
         oracle.kv.ssl.trustStoreType=PKCS12
         oracle.kv.ssl.protocols=TLSv1.2
         oracle.kv.ssl.hostnameVerifier=dnmatch(CN\=NoSQL)
         oracle.kv.transport=ssl
  6. 更新されたセキュリティ・ディレクトリを各サーバー・ノード(ストレージ・ノード)にコピーし、古いセキュリティ構成ディレクトリを置き換えます。次に、すべてのレプリケーション・ノードがオンラインであることを確認し、各ストレージ・ノードを順番に再起動します。次のSNに進む前に、最後に再起動したSNが完全に稼働していることを確認してください。
    java -jar $KVHOME/lib/kvstore.jar stop -root
        /Users/my_name/tmp/kvroot/kvroot1
        (~/hg/kv/kvstore)=> java -jar $KVHOME/lib/kvstore.jar start -root $KVROOT1 &
    kv-> ping
    出力:
    Pinging components of store HSRStore based upon topology sequence #18
        10 partitions and 3 storage nodes
        Time: 2024-04-05 08:52:02 UTC Version: 24.1.11 
        Shard Status: healthy:1 writable-degraded:0 read-only:0 offline:0
        Admin Status: healthy
        Zone [name=Austin id=zn1 type=PRIMARY allowArbiters=false]
        RN Status: online:3 offline:0 maxDelayMillis:0 maxCatchupTimeSecs:0
        Storage Node [sn1] on localhost:5000    Zone: [name=Austin
        id=zn1 type=PRIMARY allowArbiters=false]   
    
        Status: RUNNING   Ver: 24.1.11 2024-04-05 08:52:02 UTC  Build id: 0d00330822fc
                Admin [admin1] Status: RUNNING,MASTER
                Rep Node [rg1-rn1]   Status: RUNNING,REPLICA
        sequenceNumber:62 haPort:5011 delayMillis:0 catchupTimeSecs:0
    
        Storage Node [sn2] on localhost:6000 Zone: [name=Austin
        id=zn1 type=PRIMARY allowArbiters=false]
        Status: RUNNING Ver: 24.1.11 2024-04-05 08:52:02 UTC Build id: 0d00330822fc
                Rep Node [rg1-rn2] Status: RUNNING,MASTER
        sequenceNumber:62 haPort:6010
    
        Storage Node [sn3] on localhost:7000 Zone: [name=Austin
        id=zn1 type=PRIMARY allowArbiters=false]
        Status: RUNNING Ver: 24.1.11 2024-04-05 08:52:02 UTC Build id: 0d00330822fc
              Rep Node [rg1-rn3] Status: RUNNING,REPLICA
        sequenceNumber:62 haPort:7010 delayMillis:0 catchupTimeSecs:0
    
        Rep Node [rg1-rn1] Status: RUNNING,REPLICA is up, now restart the next SN
    (~/hg/kv/kvstore)=> java -jar $KVHOME/lib/kvstore.jar stop -root /Users/my_name/tmp/kvroot/kvroot2
    kv->ping
    出力:
    Pinging components of store HSRStore based upon topology sequence #18
        10 partitions and 3 storage nodes
        Time: 2024-04-05 08:52:02 UTC Version: 24.1.11
        Shard Status: healthy:0 writable-degraded:1 read-only:0 offline:0
        Admin Status: healthy
    
        Zone [name=Austin id=zn1 type=PRIMARY allowArbiters=false]
        RN Status: online:2 offline:1 maxDelayMillis:? maxCatchupTimeSecs:?
        Storage Node [sn1] on localhost:5000 Zone: [name=Austin id=zn1 type=PRIMARY allowArbiters=false]
        Status: RUNNING Ver: 24.1.11 2024-04-05 08:54:02  UTC Build id: 0d00330822fc
            Admin [admin1] Status: RUNNING,MASTER
            Rep Node [rg1-rn1]   Status: RUNNING,REPLICA
        sequenceNumber:62 haPort:5011
    
        Storage Node [sn2] on localhost:6000
        Zone: [name=Austin id=zn1 type=PRIMARY allowArbiters=false] UNREACHABLE
           Rep Node [rg1-rn2] Status: UNREACHABLE
    
        Storage Node [sn3] on localhost:7000
        Zone: [name=Austin id=zn1 type=PRIMARY allowArbiters=false]
        Status: RUNNING Ver: 24.1.11 2024-04-05 08:54:02 UTC Build id: 0d00330822fc
           Rep Node [rg1-rn3] Status: RUNNING,REPLICA
        sequenceNumber:62 haPort:7010 delayMillis:? catchupTimeSecs:?
    (~/hg/kv/kvstore)=> java -jar $KVHOME/lib/kvstore.jar start -root $KVROOT2 & 
    kv->ping
    出力:
    Pinging components of store HSRStore based upon topology sequence #18
        10 partitions and 3 storage nodes
        Time: 2024-04-05 08:55:02 UTC Version: 24.1.11
        Shard Status: healthy:1 writable-degraded:0 read-only:0 offline:0
        Admin Status: healthy
        Zone [name=Austin id=zn1 type=PRIMARY allowArbiters=false]
        RN Status: online:3 offline:0 maxDelayMillis:1 maxCatchupTimeSecs:0
        Storage Node [sn1] on localhost:5000 Zone: [name=Austin id=zn1 type=PRIMARY allowArbiters=false]
        Status: RUNNING Ver: 24.1.11 2024-04-05 08:55:02 UTC Build id: 0d00330822fc
            Admin [admin1] Status: RUNNING,MASTER
            Rep Node [rg1-rn1]   Status: RUNNING,REPLICA
        sequenceNumber:63 haPort:5011
        Storage Node [sn2] on localhost:6000
        Zone: [name=Austin id=zn1 type=PRIMARY allowArbiters=false]
        Status: RUNNING Ver: 24.1.11 2024-04-05 08:55:02 UTC Build id: 0d00330822fc
           Rep Node [rg1-rn2] Status: RUNNING,REPLICA
        sequenceNumber:63 haPort:6010 delayMillis:1 catchupTimeSecs:0
        Storage Node [sn3] on localhost:7000
        Zone: [name=Austin id=zn1 type=PRIMARY allowArbiters=false]
        Status: RUNNING Ver: 24.1.11 2024-04-05 08:55:02 UTC Build id: 0d00330822fc
          Rep Node [rg1-rn3] Status: RUNNING,REPLICA
        sequenceNumber:63 haPort:7010 delayMillis:1 catchupTimeSecs:0

SSLキーおよび証明書の更新

SSLキーおよび証明書の更新ガイドラインを参照してSSLキーおよび証明書を新しいセキュリティ構成で更新するときには、merge-trustコマンドにより、NoSQL Databaseサーバーで使用されるマージ済トラストストア(store.trust)がPKCS12形式に自動変換され、既存のセキュリティ構成の元のキーストア・パスワードによって保護されます。また、-ctspwdを使用してパスワードを指定しなかった場合は、パスワード不要の新しいclient.trustがPKCS12形式で作成されます。merge-trustコマンドの実行に使用されるJavaでパスワード不要PKCS12ストアがサポートされていない場合は、JKSのclient.trustの作成にフォールバックされます。

キーおよび証明書の更新後に、キーストアおよびトラストストアをJKS形式で保持する必要がある場合は、次のコマンドを実行することで、マージする新しいセキュリティ構成を作成する必要があります。
java -jar $KVHOME/lib/kvstore.jar securityconfig config /
create -root /Users/my_name/tmp/kvroot/newKey -kspwd 123456 -kstype JKS