Skip to content
Snippets Groups Projects
Commit bfee6397 authored by Olav Morken's avatar Olav Morken
Browse files

SAMLParser: Extract raw certificate data from metadata

git-svn-id: https://simplesamlphp.googlecode.com/svn/trunk@927 44740490-163a-0410-bde0-09ae8108e29a
parent a577a2bf
No related branches found
No related tags found
No related merge requests found
...@@ -408,6 +408,7 @@ class SimpleSAML_Metadata_SAMLParser { ...@@ -408,6 +408,7 @@ class SimpleSAML_Metadata_SAMLParser {
* - 'entityid': The entity id of the entity described in the metadata. * - 'entityid': The entity id of the entity described in the metadata.
* - 'AssertionConsumerService': String with the url of the assertion consumer service which supports * - 'AssertionConsumerService': String with the url of the assertion consumer service which supports
* the browser-post binding. * the browser-post binding.
* - 'certData': X509Certificate for entity (if present).
* *
* Metadata must be loaded with one of the parse functions before this function can be called. * Metadata must be loaded with one of the parse functions before this function can be called.
* *
...@@ -444,6 +445,21 @@ class SimpleSAML_Metadata_SAMLParser { ...@@ -444,6 +445,21 @@ class SimpleSAML_Metadata_SAMLParser {
$ret['AssertionConsumerService'] = $acs['location']; $ret['AssertionConsumerService'] = $acs['location'];
/* Add certificate data. Only the first valid certificate will be added. */
foreach($spd['keys'] as $key) {
if($key['type'] !== 'X509Certificate') {
continue;
}
$certData = base64_decode($key['X509Certificate']);
if($certData === FALSE) {
/* Empty/invalid certificate. */
continue;
}
$ret['certData'] = str_replace(array("\r", "\n"), '', $key['X509Certificate']);
break;
}
/* Add organization info. */ /* Add organization info. */
$this->addOrganizationInfo($ret); $this->addOrganizationInfo($ret);
...@@ -459,6 +475,7 @@ class SimpleSAML_Metadata_SAMLParser { ...@@ -459,6 +475,7 @@ class SimpleSAML_Metadata_SAMLParser {
* - 'name': Autogenerated name for this entity. Currently set to the entity id. * - 'name': Autogenerated name for this entity. Currently set to the entity id.
* - 'SingleSignOnService': String with the url of the SSO service which supports the redirect binding. * - 'SingleSignOnService': String with the url of the SSO service which supports the redirect binding.
* - 'SingleLogoutService': String with the url where we should send logout requests/responses. * - 'SingleLogoutService': String with the url where we should send logout requests/responses.
* - 'certData': X509Certificate for entity (if present).
* - 'certFingerprint': Fingerprint of the X509Certificate from the metadata. * - 'certFingerprint': Fingerprint of the X509Certificate from the metadata.
* *
* Metadata must be loaded with one of the parse functions before this function can be called. * Metadata must be loaded with one of the parse functions before this function can be called.
...@@ -495,7 +512,7 @@ class SimpleSAML_Metadata_SAMLParser { ...@@ -495,7 +512,7 @@ class SimpleSAML_Metadata_SAMLParser {
} }
$ret['SingleSignOnService'] = $sso['location']; $ret['SingleSignOnService'] = $sso['location'];
/* Find the certificate fingerprints. */ /* Add certificate to metadata. Only the first valid certificate will be added. */
$ret['certFingerprint'] = array(); $ret['certFingerprint'] = array();
foreach($idp['keys'] as $key) { foreach($idp['keys'] as $key) {
if($key['type'] !== 'X509Certificate') { if($key['type'] !== 'X509Certificate') {
...@@ -504,16 +521,12 @@ class SimpleSAML_Metadata_SAMLParser { ...@@ -504,16 +521,12 @@ class SimpleSAML_Metadata_SAMLParser {
$certData = base64_decode($key['X509Certificate']); $certData = base64_decode($key['X509Certificate']);
if($certData === FALSE) { if($certData === FALSE) {
/* Empty/invalid certificate. */
continue; continue;
/*
* At 2008-06-18 we removed the requirement for certificate to be emedded in metadata. Instead
* of throwing an exception which caused the whole parsing to crash, we just skip adding the
* certificate fingerprint for this entity.
*
* throw new Exception('Unable to parse base64 encoded certificate data.');
*/
} }
/* Add the certificate data to the metadata. Only the first certificate will be added. */
$ret['certData'] = str_replace(array("\r", "\n"), '', $key['X509Certificate']);
$ret['certFingerprint'][] = sha1($certData); $ret['certFingerprint'][] = sha1($certData);
break; break;
} }
...@@ -534,6 +547,7 @@ class SimpleSAML_Metadata_SAMLParser { ...@@ -534,6 +547,7 @@ class SimpleSAML_Metadata_SAMLParser {
* the browser-post binding. * the browser-post binding.
* - 'SingleLogoutService': String with the url where we should send logout requests/responses. * - 'SingleLogoutService': String with the url where we should send logout requests/responses.
* - 'NameIDFormat': The name ID format this SP expects. This may be unset. * - 'NameIDFormat': The name ID format this SP expects. This may be unset.
* - 'certData': X509Certificate for entity (if present).
* *
* Metadata must be loaded with one of the parse functions before this function can be called. * Metadata must be loaded with one of the parse functions before this function can be called.
* *
...@@ -584,6 +598,22 @@ class SimpleSAML_Metadata_SAMLParser { ...@@ -584,6 +598,22 @@ class SimpleSAML_Metadata_SAMLParser {
$ret['NameIDFormat'] = $spd['nameIDFormats'][0]; $ret['NameIDFormat'] = $spd['nameIDFormats'][0];
} }
/* Add certificate data. Only the first valid certificate will be added. */
foreach($idp['keys'] as $key) {
if($key['type'] !== 'X509Certificate') {
continue;
}
$certData = base64_decode($key['X509Certificate']);
if($certData === FALSE) {
/* Empty/invalid certificate. */
continue;
}
$ret['certData'] = str_replace(array("\r", "\n"), '', $key['X509Certificate']);
break;
}
/* Add organization info. */ /* Add organization info. */
$this->addOrganizationInfo($ret); $this->addOrganizationInfo($ret);
...@@ -601,6 +631,7 @@ class SimpleSAML_Metadata_SAMLParser { ...@@ -601,6 +631,7 @@ class SimpleSAML_Metadata_SAMLParser {
* - 'SingleLogoutService': String with the url where we should send logout requests(/responses). * - 'SingleLogoutService': String with the url where we should send logout requests(/responses).
* - 'SingleLogoutServiceResponse': String where we should send logout responses (if this is different from * - 'SingleLogoutServiceResponse': String where we should send logout responses (if this is different from
* the 'SingleLogoutService' endpoint. * the 'SingleLogoutService' endpoint.
* - 'certData': X509Certificate for entity (if present).
* - 'certFingerprint': Fingerprint of the X509Certificate from the metadata. * - 'certFingerprint': Fingerprint of the X509Certificate from the metadata.
* *
* Metadata must be loaded with one of the parse functions before this function can be called. * Metadata must be loaded with one of the parse functions before this function can be called.
...@@ -650,7 +681,7 @@ class SimpleSAML_Metadata_SAMLParser { ...@@ -650,7 +681,7 @@ class SimpleSAML_Metadata_SAMLParser {
} }
/* Find the certificate fingerprint. */ /* Add certificate to metadata. Only the first valid certificate will be added. */
$ret['certFingerprint'] = array(); $ret['certFingerprint'] = array();
foreach($idp['keys'] as $key) { foreach($idp['keys'] as $key) {
if($key['type'] !== 'X509Certificate') { if($key['type'] !== 'X509Certificate') {
...@@ -659,9 +690,12 @@ class SimpleSAML_Metadata_SAMLParser { ...@@ -659,9 +690,12 @@ class SimpleSAML_Metadata_SAMLParser {
$certData = base64_decode($key['X509Certificate']); $certData = base64_decode($key['X509Certificate']);
if($certData === FALSE) { if($certData === FALSE) {
throw new Exception('Unable to parse base64 encoded certificate data.'); /* Empty/invalid certificate. */
continue;
} }
/* Add the certificate data to the metadata. Only the first certificate will be added. */
$ret['certData'] = str_replace(array("\r", "\n"), '', $key['X509Certificate']);
$ret['certFingerprint'][] = sha1($certData); $ret['certFingerprint'][] = sha1($certData);
break; break;
} }
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment