diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/vaccination/core/certificate/InvalidHealthCertificateException.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/vaccination/core/certificate/InvalidHealthCertificateException.kt
index 700ab2ddce25b728253bd2d58d46cd0ea9e795c6..39061747c4f618f90d15b5d58f4b3a6bf1d3f785 100644
--- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/vaccination/core/certificate/InvalidHealthCertificateException.kt
+++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/vaccination/core/certificate/InvalidHealthCertificateException.kt
@@ -48,20 +48,26 @@ class InvalidHealthCertificateException(
         VC_HC_CWT_NO_ISS("Issuer missing."),
     }
 
+    val showFaqButton: Boolean
+        get() = errorCode in codesVcInvalid
+
+    private val codesVcInvalid = listOf(
+        HC_BASE45_DECODING_FAILED,
+        HC_CBOR_DECODING_FAILED,
+        HC_COSE_MESSAGE_INVALID,
+        HC_ZLIB_DECOMPRESSION_FAILED,
+        HC_COSE_TAG_INVALID,
+        VC_PREFIX_INVALID,
+        VC_HC_CWT_NO_DGC,
+        VC_HC_CWT_NO_EXP,
+        VC_HC_CWT_NO_HCERT,
+        VC_HC_CWT_NO_ISS,
+        VC_JSON_SCHEMA_INVALID
+    )
+
     val errorMessage: LazyString
         get() = when (errorCode) {
-            HC_BASE45_DECODING_FAILED,
-            HC_CBOR_DECODING_FAILED,
-            HC_COSE_MESSAGE_INVALID,
-            HC_ZLIB_DECOMPRESSION_FAILED,
-            HC_COSE_TAG_INVALID,
-            VC_PREFIX_INVALID,
-            VC_HC_CWT_NO_DGC,
-            VC_HC_CWT_NO_EXP,
-            VC_HC_CWT_NO_HCERT,
-            VC_HC_CWT_NO_ISS,
-            VC_JSON_SCHEMA_INVALID,
-            -> CachedString { context ->
+            in codesVcInvalid -> CachedString { context ->
                 context.getString(ERROR_MESSAGE_VC_INVALID)
             }
             VC_NO_VACCINATION_ENTRY -> CachedString { context ->
@@ -76,6 +82,10 @@ class InvalidHealthCertificateException(
             VC_ALREADY_REGISTERED -> CachedString { context ->
                 context.getString(ERROR_MESSAGE_ALREADY_REGISTERED)
             }
+            // should never get here
+            else -> CachedString { context ->
+                context.getString(ERROR_MESSAGE_VC_INVALID)
+            }
         }
 
     override fun toHumanReadableError(context: Context): HumanReadableError {
diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/vaccination/ui/scan/VaccinationQrCodeScanFragment.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/vaccination/ui/scan/VaccinationQrCodeScanFragment.kt
index 48a09d1257473491fbe4bd5167242d3af602a449..849b002be2801efb30bd48fad6cf63c8317fb5d5 100644
--- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/vaccination/ui/scan/VaccinationQrCodeScanFragment.kt
+++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/vaccination/ui/scan/VaccinationQrCodeScanFragment.kt
@@ -12,6 +12,7 @@ import de.rki.coronawarnapp.R
 import de.rki.coronawarnapp.bugreporting.ui.toErrorDialogBuilder
 import de.rki.coronawarnapp.databinding.FragmentScanQrCodeBinding
 import de.rki.coronawarnapp.util.DialogHelper
+import de.rki.coronawarnapp.util.ExternalActionHelper.openUrl
 import de.rki.coronawarnapp.util.di.AutoInject
 import de.rki.coronawarnapp.util.permission.CameraPermissionHelper
 import de.rki.coronawarnapp.util.ui.doNavigate
@@ -19,6 +20,7 @@ import de.rki.coronawarnapp.util.ui.popBackStack
 import de.rki.coronawarnapp.util.ui.viewBinding
 import de.rki.coronawarnapp.util.viewmodel.CWAViewModelFactoryProvider
 import de.rki.coronawarnapp.util.viewmodel.cwaViewModels
+import de.rki.coronawarnapp.vaccination.core.certificate.InvalidHealthCertificateException
 import javax.inject.Inject
 
 class VaccinationQrCodeScanFragment :
@@ -67,6 +69,11 @@ class VaccinationQrCodeScanFragment :
             binding.qrCodeScanSpinner.hide()
             it.toErrorDialogBuilder(requireContext()).apply {
                 setOnDismissListener { popBackStack() }
+                if (it is InvalidHealthCertificateException && it.showFaqButton) {
+                    setNeutralButton(R.string.error_button_vc_faq) { _, _ ->
+                        openUrl(getString(R.string.error_button_vc_faq_link))
+                    }
+                }
             }.show()
         }
     }
diff --git a/Corona-Warn-App/src/main/res/values-de/vaccination_strings.xml b/Corona-Warn-App/src/main/res/values-de/vaccination_strings.xml
index 49995e3b236828b20ef2bba82626225d3d6eb574..c5c4922eb4740a2648f10c97063c6810f6103825 100644
--- a/Corona-Warn-App/src/main/res/values-de/vaccination_strings.xml
+++ b/Corona-Warn-App/src/main/res/values-de/vaccination_strings.xml
@@ -85,7 +85,7 @@
     </plurals>
 
     <!-- XTXT: Vaccination QR code scan error message-->
-    <string name="error_vc_invalid">Dieser QR-Code ist kein gültiges Impfzertifikat.</string>
+    <string name="error_vc_invalid">Dieser QR-Code ist kein gültiges Impfzertifikat.\n\nWeitere Informationen zum Erhalt Ihres Impfzertifikats finden Sie in den FAQ.</string>
     <!-- XTXT: Vaccination QR code scan error message-->
     <string name="error_vc_not_yet_supported">Dieses Impfzertifikat wird in Ihrer App-Version noch nicht unterstützt. Bitte aktualisieren Sie Ihre App oder wenden Sie sich an die technische Hotline unter „App-Informationen“.</string>
     <!-- XTXT: Vaccination QR code scan error message-->
@@ -111,5 +111,9 @@
     <string name="vaccination_consent_onboarding_legal_information">"Weitere Hinweise finden Sie in der Datenschutzerklärung."</string>
     <!-- XBUT: Text for vaccination consent accept button -->
     <string name="vaccination_consent_accept_button">"Weiter"</string>
+    <!-- XBUT: Text for invalid vaccination certificate error button, linking to FAQ-->
+    <string name="error_button_vc_faq">FAQ zu Impfzertifikaten</string>
+    <!-- XTXT: Explains user about vaccination certificate: URL, has to be "translated" into english (relevant for all languages except german) - https://www.coronawarn.app/en/faq/#vac_cert_invalid -->
+    <string name="error_button_vc_faq_link">https://www.coronawarn.app/de/faq/#vac_cert_invalid</string>
 
-</resources>
\ No newline at end of file
+</resources>
diff --git a/Corona-Warn-App/src/main/res/values/vaccination_strings.xml b/Corona-Warn-App/src/main/res/values/vaccination_strings.xml
index 36b9bdc95d905ee11194fcb6efe68bbf5b10ec6e..d990f30441878ebdd3276e7bd041b7825aaee1f7 100644
--- a/Corona-Warn-App/src/main/res/values/vaccination_strings.xml
+++ b/Corona-Warn-App/src/main/res/values/vaccination_strings.xml
@@ -111,5 +111,9 @@
     <string name="vaccination_consent_onboarding_legal_information">"For more information, please refer to the privacy notice."</string>
     <!-- XBUT: Text for vaccination consent accept button -->
     <string name="vaccination_consent_accept_button">"Continue"</string>
+    <!-- XBUT: Text for invalid vaccination certificate error button, linking to FAQ-->
+    <string name="error_button_vc_faq">FAQ zu Impfzertifikaten</string>
+    <!-- XTXT: Explains user about vaccination certificate: URL, has to be "translated" into english (relevant for all languages except german) - https://www.coronawarn.app/en/faq/#vac_cert_invalid -->
+    <string name="error_button_vc_faq_link">https://www.coronawarn.app/en/faq/#vac_cert_invalid</string>
 
-</resources>
\ No newline at end of file
+</resources>