Suportul complet SAML 2.0 atat pentru server cat si pentru client a fost adaugat recent la Wss4jSecurityInterceptor in versiunea 2.2.0.RC1 a Spring-WS. Urmatorul este un exemplu simplu care demonstreaza aceasta noua functionalitate.
Spring-WS este un cadru pentru implementarea serviciilor SOAP folosind un model „primul contract”. Puteti citi mai multe despre proiect si motivul care sta la baza abordarii primului contract aici http://docs.spring.io/spring-ws/site/reference/html/why-contract-first.html. Pentru a va asigura serviciile SOAP, Spring-WS accepta utilizarea extensiei WS-Security la standardul SOAP. Standardul WS-Security include mai multe modalitati de a transmite informatii de autentificare si autorizare in mesajele dvs. SOAP, dintre care una foloseste afirmatiile SAML.
Voi presupune daca cititi acest lucru ca stiti sa configurati un proiect de baza Spring-WS, dar, daca nu, puteti consulta codul complet pentru exemplul meu aici https://github.com/jaminh/spring- saml-exemplu-razboi sau unul dintre numeroasele alte tutoriale (http://docs.spring.io/spring-ws/site/reference/html/tutorial.html).
Vom incepe trecand peste configurarea Wss4jSecurityInterceptor pentru validarea jetoanelor SAML din partea serverului.
<sws: interceptors> <bean id = “securityInterceptor” class = “org.springframework.ws.soap.security.wss4j.Wss4jSecurityInterceptor”> <name name = “validationActions” value = “Timestamp SAMLTokenSigned Signature” /> <nume de proprietate = “validationSignatureCrypto” ref = “crypto” /> </bean> </ sws: interceptors> <bean id = “crypto” class = “org.springframework.ws.soap.security.wss4j.support.CryptoFactoryBean”> <nume de proprietate = “keyStorePassword” value = “parola” /> <property name = “defaultX509Alias” value = “selfsigned” /> <property name = “keyStoreLocation” value = “classpath: /keystore.jks” /> </bean>
Actiunile de validare sunt setate pe „Timestamp”, „SAMLTokenSigned” si „Semnatura”. Momentul de timp nu este intr-adevar necesar pentru validarea afirmatiilor SAML, dar este, in general, o idee buna sa includeti in securitatea mesajelor dvs. oricum.
Adaugarea „SAMLTokenSigned” necesita ca un antet SAML sa fie inclus in antetul de securitate si sa fie semnat simbolul SAML. Semnarea permite receptorului mesajului sa verifice daca simbolul SAML a venit de la o entitate in care pot avea incredere. Puteti utiliza, de asemenea, „SAMLTokenUnsigned” daca nu aveti nevoie de acest nivel suplimentar de verificare.
Optiunea „Semnatura” poate fi sau nu necesara in functie de strategia pe care o utilizati pentru confirmarea subiectului. SAML are trei metode de confirmare a subiectului: Titularul de cheie, Tichetele pentru expeditor si Purtatorul. In metoda Holder-of-Key, care este utilizata in acest exemplu, emitentul afirmatiei SAML include cheia publica a subiectelor. Pentru a demonstra ca expeditorul de mesaje este subiectul specificat in afirmatie, expeditorul trebuie sa semneze mesajul cu cheia privata corespunzatoare. Acest lucru face astfel incat, chiar daca altcineva primeste afirmatia SAML, nu poate trimite mesaje cu aceasta. Pentru a procesa semnatura folosita pentru Titularul de cheie, trebuie adaugata optiunea „Semnatura”.
Pentru a verifica afirmatia SAML semnata, interceptorul trebuie sa includa un „Crypto” care contine lista certificatelor de incredere. Spring-WS ofera o fabrica pentru crearea Crypto-ului dintr-un magazin de chei JKS. In acest exemplu folosesc doar un certificat semnat. Puteti gasi instructiuni pentru generarea magazinelor cheie JKS aici http://www.sslshopper.
Array
com/article-how-to-create-a-self-signed-certificate-using-java-keytool.html.
In continuare vom trece peste configurarea clientului pentru a trimite afirmatii SAML.
Primul lucru pe care va trebui sa il faceti este sa creati un CallbackHandler pentru a genera simbolul SAML. Urmatorul lucru se bazeaza pe un astfel de CallbackHandler utilizat de testele wss4j.
http://svn.apache.org/repos/asf/webservices/wss4j/branches/1_6_x-fixes/src/test/java/org/apache/ws/security/common/SAML2CallbackHandler.java
1: / ** 2: * Licentiat la Apache Software Foundation (ASF) in baza unuia 3: * sau mai multe acorduri de licenta pentru contribuitori. Consultati fisierul AVIZ 4: * distribuit cu aceasta lucrare pentru informatii suplimentare 5: * cu privire la proprietatea drepturilor de autor. ASF acorda acest fisier 6: * pentru dvs. sub Licenta Apache, versiunea 2.0 (versiunea 7: * „Licenta”); nu puteti utiliza acest fisier decat in conformitate cu 8: * cu Licenta. Puteti obtine o copie a licentei la numarul 9: * 10: * http://www.apache.org/licenses/LICENSE-2.0 11: * 12: * Daca nu este cerut de legea aplicabila sau nu este convenit in scris, 13: * software-ul distribuit sub Licenta este distribuit pe o BAZA 14: * „AsA ESTE”, FARA GARANTII SAU CONDITII DIN ANI 15: * TIP, fie expres, fie implicit. Consultati Licenta pentru limbajul specific 16: * care reglementeaza permisiunile si limitarile 17: * sub Licenta. 18: * / 19: 20: pachet org.apache.ws.security.common; 21: 22: import java.io.IOException; 23: 24: import javax.security.auth.callback.Callback; 25: import javax.security.auth.callback.UnsupportedCallbackException; 26: 27: import org.apache.ws.security.components.crypto.Crypto; 28: import org.apache.ws.security.components.crypto.CryptoType; 29: import org.apache.ws.security.saml.ext.SAMLCallback; 30: import org.
- sheeva porn
- laura_cornett porn
- fat black porn
- index of porn
- jessy taylor porn
- seducing mom porn
- futa cum porn
- spider verse porn
- caity lotz porn
- 3d rape porn
- mhw handler porn
- inside riley porn
- spider woman porn
- sekiro porn
- homemade taboo porn
- ryan reid porn
- spiderman ps4 porn
- halsey porn
- bolt porn
- dragon quest porn
apache.ws.security.saml.ext.bean.KeyInfoBean; 31: import org.apache.ws.security.saml.ext.bean.SubjectBean; 32: import org.apache.ws.security.saml.ext.builder.SAML2Constants; 33: import org.opensaml.common.SAMLVersion; 34: 35: / ** 36: * O implementare a Callback Handler pentru o afirmatie SAML 2. In mod implicit, creeaza o afirmatie de autentificare 37: * folosind Vouches Sender. 38: * / 39: public class SAML2CallbackHandler extinde AbstractSAMLCallbackHandler {40: 41: public SAML2CallbackHandler (Crypto crypto, String alias) arunca exceptie {42: if (certs == null) {43: CryptoType cryptoType = new CryptoType (CryptoType.PE); 44: cryptoType.setAlias (alias); 45: certs = crypto.getX509Certificates (cryptoType); 46:} 47: 48: subiectName = “uid = joe, ou = oameni, ou = saml-demo, o = exemplu.com”; 49: subjectQualifier = “www.exemplu.com”; 50: confirmareMethod = SAML2Constants.CONF_HOLDER_KEY; 51:} 52: 53: public void handle (callback [Callback]) 54: arunca IOException, UnsupportedCallbackException {55: for (int i = 0; i <callbacks.length; i ++) {56: if (callbacks [i] instanceof SAMLCallback) {57: apelare returnare SAMLC = returnari (SAMLCallback) [i]; 58: callback.setSamlVersion (SAMLVersion.VERSION_20); 59: callback.setIssuer (emitent); 60: SubjectBean subjectBean = 61: new SubjectBean (62: subiectName, subjectQualifier, confirmMethod 63:); 64: if (SAML2Constants.CONF_HOLDER_KEY.equals (confirmMethod)) {65: try {66: KeyInfoBean keyInfo = createKeyInfo (); 67: subiectBean.setKeyInfo (keyInfo); 68:} catch (Exceptie ex) {69: arunca o noua IOException („Problema crearii KeyInfo:” + ex.getMessage ()); 70:} 71:} 72: callback.setSubject (subiectBean); 73: createAndSetStatement (nul, callback); 74:} else {75: arunca unsupportedCallbackException nou (apeluri [i], “Callback nerecunoscut”); 76:} 77:} 78:} 79: 80:} KeyInfoBean keyInfo = createKeyInfo (); 67: subiectBean.setKeyInfo (keyInfo); 68:} catch (Exceptie ex) {69: arunca o noua IOException („Problema crearii KeyInfo:” + ex.getMessage ()); 70:} 71:} 72: callback.setSubject (subiectBean); 73: createAndSetStatement (nul, callback); 74:} else {75: arunca unsupportedCallbackException nou (apeluri [i], “Callback nerecunoscut”); 76:} 77:} 78:} 79: 80:} KeyInfoBean keyInfo = createKeyInfo (); 67: subiectBean.setKeyInfo (keyInfo); 68:} catch (Exceptie ex) {69: arunca un nou IOException (“Probleme de creare KeyInfo:” + ex.getMessage ()); 70:} 71:} 72: callback.setSubject (subiectBean); 73: createAndSetStatement (nul, callback); 74:} else {75: arunca nou UnsupportedCallbackException (apeluri [i], “Callback nerecunoscut”); 76:} 77:} 78:} 79: 80:}
http://svn.apache.org/repos/asf/webservices/wss4j/branches/1_6_x-fixes/src/test/java/org/apache/ws/security/common/AbstractSAMLCallbackHandler.java
1: / ** 2: * Licentiat la Apache Software Foundation (ASF) in baza unuia 3: * sau mai multe acorduri de licenta pentru contribuitori. Consultati fisierul AVIZ 4: * distribuit cu aceasta lucrare pentru informatii suplimentare 5: * cu privire la proprietatea drepturilor de autor. ASF acorda acest fisier 6: * pentru dvs. sub Licenta Apache, versiunea 2.0 (versiunea 7: * „Licenta”); nu puteti utiliza acest fisier decat in conformitate cu 8: * cu Licenta. Puteti obtine o copie a licentei la numarul 9: * 10: * http://www.apache.org/licenses/LICENSE-2.0 11: * 12: * Daca nu este cerut de legea aplicabila sau nu este convenit in scris, 13: * software-ul distribuit sub Licenta este distribuit pe o BAZA 14: * „AsA ESTE”, FARA GARANTII SAU CONDITII DIN ANI 15: * TIP, fie expres, fie implicit. Consultati Licenta pentru limbajul specific 16: * care reglementeaza permisiunile si limitarile 17: * sub Licenta. 18: * / 19: 20: pachet org.apache.ws.security.common; 21: 22: import org.apache.ws.security.WSConstants; 23: import org.apache.ws.security.message.WSSecEncryptedKey; 24: import org.apache.ws.security.saml.ext.SAMLCallback; 25: import org.apache.ws.security.saml.ext.bean.ActionBean; 26: import org.apache.ws.security.saml.ext.bean.AttributeBean; 27: import org.apache.ws.security.saml.ext.bean.AttributeStatementBean; 28: import org.apache.ws.security.saml.ext.bean.AuthenticationStatementBean; 29: import org.apache.ws.security.saml.ext.bean.AuthDecisionStatementBean; 30: import org.apache.ws.security.saml.ext.bean.KeyInfoBean; 31: import org.apache.ws.security.saml.ext.bean.SubjectBean; 32: import org.apache.ws.security.saml.ext.bean.KeyInfoBean.CERT_IDENTIFIER; 33: import org.w3c.dom.Document; 34: import org.w3c.dom.Element; 35: 36: import javax.security.auth.callback.CallbackHandler; 37: import javax.xml.parsers.DocumentBuilder; 38: import javax.xml.parsers.DocumentBuilderFactory; 39: 40: import java.security.cert.X509Certificat; 41: import java.util.Collections; 42: 43: / ** 44: * O implementare de baza a unui Callback Handler pentru o afirmatie SAML. In mod implicit, creeaza o afirmatie de autentificare 45: *. 46: * / 47: public abstract class AbstractSAMLCallbackHandler implementeaza CallbackHandler {48: 49: public enum Statement {50: AUTHN, ATTR, AUTHZ 51:}; 52: 53: protected String subiectName = null; 54: protected String subiectQualifier = nul; 55: protected String confirmMethod = null; 56: certificate protejate X509Certificate []; 57: declaratie Declaratie protejata = Declaratie.AUTHN; 58: protejat CERT_IDENTIFIER certIdentifier = CERT_IDENTIFIER.X509_CERT; 59: byte protejat [] efhemeralKey = null; 60: emitent String protejat = nul; 61: 62: public void setConfirmationMethod (String confMethod) {63: confirmationMethod = confMethod; 64:} 65: 66: public void setStatement (declaratie declaratie) {67: this.statement = instructiune; 68:} 69: 70: public void setCertIdentifier (CERT_IDENTIFIER certIdentifier) {71: this.certIdentifier = certIdentifier; 72:} 73: 74: public void setCerts (X509Certificate [] certs) {75: this.certs = certs; 76:} 77: 78: byte public [] getEphemeralKey () {79: return ephemeralKey; 80:} 81: 82: public void setIssuer (String emitent) {83: this.issuer = emitent; 84:} 85: 86: / ** 87: * Retineti ca parametrul SubjectBean ar trebui sa fie nul pentru SAML2.0 88: * / 89: protected void createAndSetStatement (subiectBean subiectBean, SAMLCallback returnback) {90: if (statement == Statement .AUTHN) {91: AuthenticationStatementBean authBean = new AuthenticationStatementBean (); 92: if (subiectBean! = Null) {93: authBean.setSubject (subiectBean); 94:} 95: authBean.setAuthenticationMethod (“Parola”); 96: callback.setAuthenticationStatementData (Collections.singletonList (authBean)); 97:} else if (statement == Statement.ATTR) {98: AttributeStatementBean attrBean = new AttributeStatementBean (); 99: if (subiectBean! = Null) {100: attrBean.setSubject (subiectBean); 101:} 102: AttributeBean attributeBean = new AttributeBean (); 103: attributeBean.setSimpleName (“rol”); 104: attributeBean.setAttributeValues (Collections.singletonList („utilizator”)); 105: attrBean.setSamlAttributes (Collections.singletonList (atributBean)); 106: callback.setAttributeStatementData (Collections.singletonList (attrBean)); 107:} altceva {108: AuthDecisionStatementBean authzBean = new AuthDecisionStatementBean (); 109: if (subiectBean! = Null) {110: authzBean.setSubject (subiectBean); 111:} 112: ActionBean actionBean = new ActionBean (); 113: actionBean.setContents (“Citeste”); 114: authzBean.setActions (Collections.singletonList (actionBean)); 115: authzBean.setResource (“punct final”); 116: authzBean.setDecision (AuthDecisionStatementBean.Decision.PERMIT); 117: callback.setAuthDecisionStatementData (Collections.singletonList (authzBean)); 118:} 119:} 120: 121: protejat KeyInfoBean createKeyInfo () arunca exceptie {122: KeyInfoBean keyInfo = new KeyInfoBean (); 123: if (statement == Statement.AUTHN) {124: keyInfo.setCertificat (certs [0]); 125: keyInfo.setCertIdentifer (certIdentifier); 126:} else if (statement == Statement.ATTR) {127: // Construiti un nou document 128: DocumentBuilderFactory docBuilderFactory = 129: DocumentBuilderFactory.newInstance (); 130: docBuilderFactory.setNamespaceAware (adevarat); 131: DocumentBuilder docBuilder = docBuilderFactory.newDocumentBuilder (); 132: Document doc = docBuilder.newDocument (); 133: 134: // Creati o cheie criptata 135: WSSecEncryptedKey encrKey = new WSSecEncryptedKey (); 136: encrKey.setKeyIdentifierType (WSConstants.X509_KEY_IDENTIFIER); 137: encrKey.setUseThisCert (certs [0]); 138: encrKey.prepare (doc, nul); 139: efhemeralKey = encrKey.getEphemeralKey (); 140: Element encryptedKeyElement = encrKey.getEncryptedKeyElement (); 141: 142: // Adaugati EncryptedKey la un element KeyInfo 143: Element keyInfoElement = 144: doc.createElementNS (145: WSConstants.SIG_NS, WSConstants.SIG_PREFIX + “:” + WSConstants.KEYINFO_LN 146:); 147: keyInfoElement.setAttributeNS (148: WSConstants.XMLNS_NS, “xmlns:” + WSConstants.SIG_PREFIX, WSConstants.SIG_NS 149:); 150: keyInfoElement.appendChild (criptatKeyElement); 151: 152: keyInfo.setElement (keyInfoElement); 153:} 154: return keyInfo; 155:} 156:}
AbstractSAMLCallbackHandlerjust trateaza detaliile crearii XML pentru KeyInfo si AuthenticationStatement. SAML2CallbackHandler seteaza valorile subiectului utilizate in afirmatie si primeste acces la certificatul de client care trebuie utilizat pentru a confirma semnatura mesajului.
Dupa ce ai un SAML CallbackHandler, poti crea Wss4jSecurityInterceptor pentru client.
CryptoFactoryBean cryptoFactory = new CryptoFactoryBean (); cryptoFactory.setKeyStoreLocation (noua ClassPathResource (“keystore.jks”)); cryptoFactory.setKeyStorePassword ( “parola”); cryptoFactory.afterPropertiesSet (); Crypto crypto = cryptoFactory.getObject (); SAML2CallbackHandler samlCallbackHandler = SAML2CallbackHandler nou (crypto, „autosemnat”); SAMLIssuerImpl issuer = new SAMLIssuerImpl (); issuer.setIssuerCrypto (cripto); issuer.setIssuerKeyName ( “selfsigned”); issuer.setIssuerKeyPassword ( “parola”); issuer.setIssuerName ( “selfsigned”); issuer.setSendKeyValue (false); issuer.setSignAssertion (true); issuer.setCallbackHandler (samlCallbackHandler); Wss4jSecurityInterceptor securityInterceptor = new Wss4jSecurityInterceptor (); securityInterceptor.setSecurementActions (“
In primul rand, trebuie sa cream Crypto din magazinul nostru de chei JKS, atat pentru semnarea afirmatiei SAML, cat si pentru semnarea mesajului pentru confirmarea subiectului detinator de cheie. Apoi, SAML2CallbackHandler este creat pentru a trece la un SAMLIssuer. SAMLIssuer are grija sa genereze intreaga afirmatie SAML si sa o semneze, daca i se spune acest lucru. In cele din urma, puteti crea Wss4jSecurityInterceptor. Veti observa pentru clientul necesar doar pentru a specifica „Timestamp” si „SAMLTokenSigned” pentru actiuni. In ceea ce priveste clientul, wss4j este capabil sa inteleaga ca daca se foloseste confirmarea subiectului titularului cheii, atunci trebuie sa fie inclusa o semnatura, astfel incat actiunea „Semnatura” nu este necesara.








