Last updated on October 15, 2026
This guide shows how to connect your Shibboleth Identity Provider to Mailzzy using SAML 2.0, so your team signs in to Mailzzy with their institutional account. Mailzzy acts as the service provider (SP) and your Shibboleth IdP as the identity provider (IdP). The steps apply to Shibboleth IdP 5.x and 4.x.
Once setup is complete, people in your email domain click Sign in with SSO on the Mailzzy sign-in page, enter their work email, and authenticate on your Shibboleth login page.
Note: Setup is usually shared between a Mailzzy administrator (Steps 1, 3, and 9) and a Shibboleth administrator (Steps 2 and 4 to 7). Do the steps in order: Mailzzy only publishes its SP metadata after the connector has your IdP details, so Step 3 must be finished before Step 4.
Make sure you have the following:
Each Mailzzy account can have one SAML 2.0 connector and one OIDC connector, and only one of them can be active at a time.
Mailzzy reserves the connector and shows its service provider values. Each value has a Copy button, and you can reopen them at any time from the connector's More actions menu (⋮) with SP Setup Info.
| Value in Mailzzy | What it's used for in Shibboleth |
|---|---|
SP Entity ID / Audience URI / Metadata URL | Identifies Mailzzy in every Shibboleth configuration file below, and is also the address of the Mailzzy SP metadata. |
ACS URL / Reply URL / Single Sign-On URL | Where Shibboleth sends the SAML response. It's included in the SP metadata, so you don't enter it separately. |
NameID Format | urn:oasis:names:tc:SAML:1.1:nameid-format:emailAddress |
Signature / Digest Algorithm | RSA-SHA256 |
Note: The URLs include an ID that is unique to your connector. Send the exact SP Entity ID / Audience URI / Metadata URL from your account to your Shibboleth administrator. It must match character for character in every step below.
Your Shibboleth administrator collects these values for the Mailzzy administrator:
| Field in Mailzzy | Where to find it in Shibboleth |
|---|---|
IdP Entity ID / Issuer | The idp.entityID property in conf/idp.properties, for example https://idp.example.edu/idp/shibboleth |
IdP SSO URL | https://your-idp-host/idp/profile/SAML2/Redirect/SSO |
IdP Signing Certificate (PEM) | The contents of credentials/idp-signing.crt. Use the signing certificate, not idp-backchannel.crt or idp-encryption.crt. |
IdP Single Logout URL (optional) | https://your-idp-host/idp/profile/SAML2/Redirect/SLO, only if you have configured single logout on your IdP. |
Mailzzy sends its sign-in requests with the HTTP-Redirect binding, so use the Redirect/SSO endpoint.
Mailzzy can also read these values from a metadata URL, such as https://your-idp-host/idp/shibboleth. Use that option only if the metadata is kept up to date (the file generated at install time isn't updated automatically when keys or endpoints change), the URL is reachable from the internet, and it's served with a publicly trusted HTTPS certificate. Otherwise, use manual entry.
Mailzzy confirms "SSO is now live for this connector," and the connector's status changes to Live. Opening the SP Entity ID / Audience URI / Metadata URL in a browser now returns an XML document.
The Mailzzy SP metadata contains its entity ID, its ACS URL, and the certificates it uses to sign sign-in requests and decrypt assertions. Mailzzy signs every sign-in request, so Shibboleth needs this metadata, certificate included. A hand-written metadata entry without the certificate won't work.
The metadata isn't signed, so save a reviewed copy on the IdP rather than fetching it live:
curl -o /opt/shibboleth-idp/metadata/mailzzy-sp.xml \
"PASTE-YOUR-SP-ENTITY-ID-HERE"<MetadataProvider id="Mailzzy" xsi:type="FilesystemMetadataProvider"
metadataFile="%{idp.home}/metadata/mailzzy-sp.xml"/>The Mailzzy signing key pair is valid for three years. Download the metadata again whenever the connector's certificate changes.
Mailzzy identifies users by email, but Shibboleth sends a random, one-time (transient) NameID by default. Change that for Mailzzy:
<bean parent="shibboleth.SAML2AttributeSourcedGenerator"
p:omitQualifiers="true"
p:format="urn:oasis:names:tc:SAML:1.1:nameid-format:emailAddress"
p:attributeSourceIds="#{ {'mail'} }" /><bean id="Mailzzy" parent="RelyingPartyByName"
c:relyingPartyIds="PASTE-YOUR-SP-ENTITY-ID-HERE">
<property name="profileConfigurations">
<list>
<bean parent="SAML2.SSO"
p:nameIDFormatPrecedence="urn:oasis:names:tc:SAML:1.1:nameid-format:emailAddress" />
</list>
</property>
</bean>Note: Leave assertion encryption at the Shibboleth default (on). Mailzzy publishes an encryption certificate in its metadata and decrypts assertions.
The NameID generator can only use attributes that are released to Mailzzy, so mail must be released. In conf/attribute-filter.xml, add this policy inside the AttributeFilterPolicyGroup element, using your SP Entity ID. Include the name attributes only if your attribute resolver defines them:
<AttributeFilterPolicy id="Mailzzy">
<PolicyRequirementRule xsi:type="Requester"
value="PASTE-YOUR-SP-ENTITY-ID-HERE" />
<AttributeRule attributeID="mail" permitAny="true" />
<!-- Optional, to fill in names in Mailzzy: -->
<AttributeRule attributeID="givenName" permitAny="true" />
<AttributeRule attributeID="sn" permitAny="true" />
<AttributeRule attributeID="displayName" permitAny="true" />
</AttributeFilterPolicy>No attribute mapping is needed in Mailzzy. It already recognizes the attribute names Shibboleth sends by default:
| Mailzzy field | Shibboleth attribute | SAML attribute name |
|---|---|---|
Email | mail | urn:oid:0.9.2342.19200300.100.1.3 |
First name | givenName | urn:oid:2.5.4.42 |
Last name | sn | urn:oid:2.5.4.4 |
Display name | displayName | urn:oid:2.16.840.1.113730.3.1.241 |
New users are always created from these values. For people who already have an account, names are updated at sign-in only if you turn on the matching Sync on login option in the connector's More actions menu (⋮) under Attribute mapping.
Reload the services you changed, or restart the IdP's servlet container instead:
cd /opt/shibboleth-idp
bin/reload-service.sh -id shibboleth.MetadataResolverService
bin/reload-service.sh -id shibboleth.RelyingPartyResolverService
bin/reload-service.sh -id shibboleth.AttributeFilterService
bin/reload-service.sh -id shibboleth.NameIdentifierGenerationServicereload-service.sh contacts the IdP at http://localhost/idp by default. If your IdP listens only on HTTPS, add -u https://localhost/idp to each command; the script must also trust the IdP's HTTPS certificate.
Check logs/idp-process.log for errors and for a line confirming that the Mailzzy metadata loaded (it mentions FilesystemMetadataResolver Mailzzy and mailzzy-sp.xml).
To preview exactly what Mailzzy will receive for a user, run this on the IdP host (the admin pages are limited to localhost by default), with your SP Entity ID URL-encoded:
curl -k "https://localhost/idp/profile/admin/resolvertest?principal=USERNAME&requester=URL-ENCODED-SP-ENTITY-ID&saml2"The output should show a NameID with the emailAddress format and the user's email address.
You can also start a test from the connector's More actions menu (⋮) with Test SSO. If you turned on Automatically onboard new SSO users, also test with someone who doesn't have a Mailzzy account yet, and confirm their account is created on first sign-in.
Once sign-in works, open the connector's More actions menu (⋮), select Edit, and turn on Require SSO for users on these domains. Password sign-in is then blocked for those domains.
Choose a Password-fallback user (break-glass account), an administrator who can still sign in with a password if your IdP is unavailable. It defaults to the person who set up SSO. Then click Save Changes.
| What you see | Likely cause | What to do |
|---|---|---|
The SP metadata URL returns a 401 error | The connector doesn't have your IdP details yet | Finish Step 3, then download the metadata |
"Single sign-on isn't set up for this email" on the Mailzzy sign-in page | The email's domain isn't on a Live connector | Check the connector's email domains and status |
Shibboleth shows "Unsupported Request" and its log reports no metadata for the requester | The Mailzzy metadata isn't loaded, or the entity ID doesn't match | Recheck Step 4 and compare the entityID with the SP Entity ID character for character |
The Shibboleth log reports a signature failure on the request | The IdP has an outdated copy of the Mailzzy metadata | Download the metadata again (Step 4) and reload |
The Shibboleth log mentions InvalidNameIDPolicy, or Mailzzy can't find an email | The email NameID isn't being generated | Recheck Steps 5 and 6. The mail attribute must be resolved and released to Mailzzy. |
Sign-in at Shibboleth succeeds, but you return to the Mailzzy sign-in page with an SSO error | The connector isn't Live, or the user has no Mailzzy account and auto-onboarding is off | Check the connector status, turn on auto-onboarding, or invite the user |
Mailzzy rejects the SAML response | The certificate in Mailzzy isn't your current signing certificate, or the IdP clock is wrong | Re-enter idp-signing.crt (Step 3) and make sure the IdP host syncs its time (NTP) |
reload-service.sh reports Connection refused or a certificate (PKIX) error | The script uses the wrong URL, or doesn't trust the IdP's HTTPS certificate | Add -u https://localhost/idp, or restart the servlet container instead |
The SAML connector shows Paused | Another connector (for example, OIDC) was activated, and only one can be active | Reactivate the SAML connector |
Deleting the connector stops SSO for its domains immediately. Users who never set a Mailzzy password will need to reset it to sign in.
If you get stuck, email support@mailzzy.com with your connector name, your Shibboleth IdP version, the approximate time of a failed sign-in, and any related lines from logs/idp-process.log. Never send private keys or passwords.
Let's keep in touch
Sign up for our weekly email marketing newsletter and Mailzzy updates.
For more details, review our Privacy Policy