私は、例TLS Traffic Encryption Exampleに記載されているのと同様の方法を使用して認証することができました。 1の例から期待通り
だから、私はSNMP4Jは、Javaプロパティjavax.net.ssl.keystore
、javax.net.ssl.keyStorePassword
、javax.net.ssl.trustStore
、およびjavax.net.ssl.trustStorePassword
に設定されたキーストアを使用していることを確認することができます。
以下に、この例を変更して動作させる方法を示します。
コンストラクタでエイリアス(またはドキュメントのセキュリティ名)を設定して、使用する証明書を知る必要があります。
CertifiedTarget ct = new CertifiedTarget(new OctetString(alias));
セキュリティレベルを設定する必要があります。そうしないと、SNMPエージェントが認証に失敗し、認証に失敗します。
ct.setSecurityLevel(SecurityLevel.AUTH_PRIV);
SecurityCallback
対象DNは、それはそれ以外の場合は、すべての応答を拒否します望んでいるEXACTLY方法サーバー証明書のサブジェクトと一致する必要があります。
securityCallback.addAcceptedSubjectDN("[email protected], CN=snmpagent, OU=Development, O=Net-SNMP, L=Davis, ST=CA, C=US");
最後に、サーバーの公開証明書エイリアス(セキュリティ名)をアドレスに登録する必要があります。
securityCallback.addLocalCertMapping(ct.getAddress(), "snmpagent");
このように表示されます。
// Set java keystore manually
System.setProperty("javax.net.ssl.keyStore", KEYSTORE_DIR);
System.setProperty("javax.net.ssl.keyStorePassword", "changeit");
System.setProperty("javax.net.ssl.trustStore", KEYSTORE_DIR);
System.setProperty("javax.net.ssl.trustStorePassword", "changeit");
// create the TLS transport mapping:
TLSTM transport = new TLSTM();
// set the security callback (only required for command responder,
// but also recommended for command generators) -
// the callback will be configured later:
DefaultTlsTmSecurityCallback securityCallback = new DefaultTlsTmSecurityCallback();
((TLSTM) transport).setSecurityCallback(securityCallback);
MessageDispatcher md = new MessageDispatcherImpl();
// we need MPv3 for TLSTM:
MPv3 mpv3 = new MPv3();
md.addMessageProcessingModel(mpv3);
Snmp snmp = new Snmp(md, transport);
// create and initialize the TransportSecurityModel TSM:
SecurityModels.getInstance().addSecurityModel(new TSM(new OctetString(mpv3.getLocalEngineID()), false));
// do not forget to listen for responses:
snmp.listen();
CertifiedTarget ct = new CertifiedTarget(new OctetString("alias"));
ct.setVersion(SnmpConstants.version3);
ct.setSecurityModel(SecurityModel.SECURITY_MODEL_TSM);
ct.setAddress(GenericAddress.parse(myAddress));
ct.setSecurityLevel(SecurityLevel.AUTH_PRIV);
securityCallback.addAcceptedSubjectDN("[email protected], CN=snmpagent, OU=Development, O=Net-SNMP, L=Davis, ST=CA, C=US");
securityCallback.addLocalCertMapping(ct.getAddress(), "snmpagentalias");
PDU pdu = new ScopedPDU();
pdu.add(new VariableBinding(new OID(someOid)));
pdu.setType(PDU.GET);
ResponseEvent response = snmp.send(pdu, ct);
また、すべての証明書が実際に正しく設定されていることを確認する必要があります。
私のチームの発見で、主にトランスポート層でSNMP4JによるTLS処理にいくつかのバグが発見されました。これはSNMPデータを取得して無視するタイミングの問題(競合状態かもしれません)のようです。 CertifiedTarget
タイムアウトを設定して再試行し、本当に再試行できました。私たちは、より多くの情報があるとき、正式に報告します。
ありがとうございます。しかし、最後に、サーバー公開証明書エイリアス(セキュリティ名)をアドレスに登録する必要があります。 securityCallback.addLocalCertMapping(ct.getAddress()、 "snmpagent"); "具体的には、「サーバー公開証明書エイリアス」とはどういう意味ですか?これは "CertifiedTarget ct = new CertifiedTarget(new OctetString(alias));"で設定されたエイリアスと同じですか? – stoneboy