[ 
https://issues.apache.org/jira/browse/RAMPART-248?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Thilina Buddhika closed RAMPART-248.
------------------------------------


Thanks for applying the patch.

> Caching crypto objects to improve the performance when using the same crypto 
> for signing and encrypting.
> --------------------------------------------------------------------------------------------------------
>
>                 Key: RAMPART-248
>                 URL: https://issues.apache.org/jira/browse/RAMPART-248
>             Project: Rampart
>          Issue Type: Improvement
>          Components: rampart-core
>    Affects Versions: 1.4
>            Reporter: Thilina Buddhika
>            Assignee: Nandana Mihindukulasooriya
>             Fix For: 1.5
>
>         Attachments: crypto-caching.patch
>
>
> When a particular cryptographic operation is taken place, a crypto object is 
> created for that operation. This process involves reading certificates from 
> the file system each time a cryptographic operation is carried out. The 
> situation gets worse when multiple threads are trying to invoke cryptographic 
> operations that involves the same certificate. This may lead to race 
> condition and ends up with an exception with the following stacktrace.
>  at java.io.FileInputStream.open(Native Method)
>         at java.io.FileInputStream.<init>(Unknown Source)
>         at java.io.FileInputStream.<init>(Unknown Source)
>         at 
> org.apache.ws.security.components.crypto.AbstractCrypto.<init>(Abstra
> ctCrypto.java:109)
>         at 
> org.apache.ws.security.components.crypto.Merlin.<init>(Merlin.java:72
> )
>         at sun.reflect.GeneratedConstructorAccessor234.newInstance(Unknown 
> Sourc
> e)
>         at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown 
> Sou
> rce)
>         at java.lang.reflect.Constructor.newInstance(Unknown Source)
>         at 
> org.apache.ws.security.components.crypto.CryptoFactory.loadClass(Cryp
> toFactory.java:211)
>         at 
> org.apache.ws.security.components.crypto.CryptoFactory.getInstance(Cr
> yptoFactory.java:93)
>         at 
> org.apache.rampart.util.RampartUtil.getSignatureCrypto(RampartUtil.ja
> va:398)
>         at 
> org.apache.rampart.PolicyBasedResultsValidator.verifyTrust(PolicyBase
> dResultsValidator.java:601)
>         at 
> org.apache.rampart.PolicyBasedResultsValidator.validate(PolicyBasedRe
> sultsValidator.java:163)
>         at org.apache.rampart.RampartEngine.process(RampartEngine.java:214)
>         at 
> org.apache.rampart.handler.RampartReceiver.invoke(RampartReceiver.jav
> a:92)
>         at org.apache.axis2.engine.Phase.invoke(Phase.java:317)
>         at org.apache.axis2.engine.AxisEngin
> ------------------------------------------
> So one possible solution for this is to implement crypto caching inside 
> RampartUtil. This can be a hashtable which stores Crypto objects against a 
> value of a unique property of a particular Crypto implementation. For example 
> : If we take Merlin as the Crypto implementation, then 
> "org.apache.ws.security.crypto.merlin.file" is the unique property for a 
> particular Crypto object.
> So it is required to identify the unique properties for a particular Crypto 
> implementation. Then enough attention should be paid to refresh the cache, 
> since there is a possibility of changing the certs in the file system. One 
> solution for this is to set a cache refresh interval and invalidate the cache 
> after that interval. So the unique property and the cache refresh interval 
> needs to be captured from the user. So these information can be included in 
> RamaprtConfig. 
> Solution :
> -----------------
> To enable caching of Crypto objects, two attributes should be added to the 
> crypto elements of "signatureCrypto"/"encryptionCrypto" of RampartConfig.
> 1.cryptoKey - As the value of this attribute, specify the property of a 
> Crypto implementation which points to the location of the keystore. For 
> example in Merlin, the property "org.apache.ws.security.crypto.merlin.file" 
> is unique and its pointing to the location of the keystore. Absence of this 
> attribute will not enable caching.
> 2.cacheRefreshInterval - This is the cache refresh interval specified in 
> milliseconds. Any object that resides in the cache longer than this period 
> will be considered as expired. Cache will not be refreshed if this attribute 
> is not present in the configuration. If you do not want to refresh the cache, 
> provide only the "cryptoKey" attribute. 
> So this is a sample of the suggested Ramapart Config.
> <ramp:RampartConfig xmlns:ramp="http://ws.apache.org/rampart/policy";>
>                           <ramp:signatureCrypto>
>                               <ramp:crypto 
> provider="org.apache.ws.security.components.crypto.Merlin" 
> cryptoKey="org.apache.ws.security.crypto.merlin.file" 
> cacheRefreshInterval="300000">
>                                         <ramp:property 
> name="org.apache.ws.security.crypto.merlin.keystore.type">JKS</ramp:property>
>                                         <ramp:property 
> name="org.apache.ws.security.crypto.merlin.file">service.jks</ramp:property>
>                                         <ramp:property 
> name="org.apache.ws.security.crypto.merlin.keystore.password">servicePW</ramp:property>
>                                 </ramp:crypto>
>                         </ramp:signatureCrypto>
>                        <ramp:encryptionCypto>
>                                <ramp:crypto 
> provider="org.apache.ws.security.components.crypto.Merlin" 
> cryptoKey="org.apache.ws.security.crypto.merlin.file" 
> cacheRefreshInterval="300000>
>                                              <ramp:property 
> name="org.apache.ws.security.crypto.merlin.keystore.type">JKS</ramp:property>
>                                              <ramp:property 
> name="org.apache.ws.security.crypto.merlin.file">service.jks</ramp:property>
>                                              <ramp:property 
> name="org.apache.ws.security.crypto.merlin.keystore.password">apache</ramp:property>
>                                 </ramp:crypto>
>                       </ramp:encryptionCypto>
> </ramp:RampartConfig>
> A sample configuration is provided below. It uses the Merlin crypto 
> implementation for signing and encryption. Here, the value of the cryptoKey 
> attribute is eqaul to "org.apache.ws.security.crypto.merlin.file" and the 
> cache refresh interval is 300000 milliseconds.
> I came with an implementation following the model explained above. his 
> implementation is done in a backward compatible way and it will not break any 
> of the current functionalities.
> WDYT ?
> Thanks.
> / thilina
>  

-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.

Reply via email to