[Android] Fix SslStreamCertificateContext empty custom trust store exception - #104016

Merged
simonrozsival merged 5 commits into
dotnet:mainfrom
simonrozsival:fix-sslstreamcertificatecontext-android
Jun 28, 2024
Merged

[Android] Fix SslStreamCertificateContext empty custom trust store exception#104016
simonrozsival merged 5 commits into
dotnet:mainfrom
simonrozsival:fix-sslstreamcertificatecontext-android

Conversation

@simonrozsival

Copy link
Copy Markdown
Member

Closes#104010
Follow-up to #103372

When building the chain, we should not only check if the trust or additional certificate collections aren't null but also if they're not empty.

It is now also possible to enable one of the disabled Android tests (#68206).

/cc @matouskozak@wfurt

@simonrozsival

Copy link
Copy Markdown
MemberAuthor

/azp run runtime-extra-platforms

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines successfully started running 1 pipeline(s).

@dotnet-policy-service

Copy link
Copy Markdown
Contributor

Tagging subscribers to this area: @dotnet/ncl, @bartonjs, @vcsjones
See info in area-owners.md if you want to be subscribed.

@rzikmrzikm left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM

@matouskozakmatouskozak left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thank you for the quick fix! It looks like there are still failures on arm Androids, however I don't think they are related. I created a new tracking issue for them #104030

@wfurtwfurt left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM

}

if (trust != null)
if (trust?._store?.Certificates.Count > 0)

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The Certificates property on X509Store reads the store live and instantiates all the certificates. Using it in this manner throws a bunch of data at the GC and finalizer queue. And has a ToC/ToU bug, as it could still end up as empty on line 60.

if (trust._trustList != null)
{
chain.ChainPolicy.CustomTrustStore.AddRange(trust._trustList);
}

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I recommend returning to the previous pattern of just calling AddRange.

Then, you can decide to only change the custom trust mode if chain.ChainPolicy.CustomTrustStore is not empty:

if(chain.ChainPolicy.CustomTrustStore.Count>0){chain.ChainPolicy.TrustMode=X509ChainTrustMode.CustomRootTrust;}

@bartonjsbartonjsJun 26, 2024

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It's not intuitive to me, though, that we'd let "I said empty custom trust" mean "so use system trust" on Android, but mean "so nothing is trusted" on other platforms.

The trust being specified as empty should really manifest as an error here, or somewhere else, not mean "just do something different".

Nevermind. I see that this chain build is just to get the issuer/issuee relationships, and that there're no revocation checks and all verification errors are suppressed.

@simonrozsival

Copy link
Copy Markdown
MemberAuthor

/azp run runtime-extra-platforms

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines successfully started running 1 pipeline(s).

@simonrozsival

Copy link
Copy Markdown
MemberAuthor

/azp run runtime-extra-platforms

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines successfully started running 1 pipeline(s).

@simonrozsival

Copy link
Copy Markdown
MemberAuthor

The failing tests in runtime-extra-platforms are all unrelated

@simonrozsival
simonrozsival merged commit 8a3e603 into dotnet:mainJun 28, 2024
@simonrozsival
simonrozsival deleted the fix-sslstreamcertificatecontext-android branch June 28, 2024 10:34
simonrozsival added a commit to simonrozsival/runtime that referenced this pull request Jul 8, 2024
…ception (dotnet#104016)
* Check if certificate collections are not empty before changing trust mode to custom root trust
* Enable SslStream_ClientCertificateContext_SendsChain test on Android
* Apply suggestions from reviews
* Avoid unnecessary allocations
vitek-karas added a commit that referenced this pull request Jul 15, 2024
…CertificateContext (#104541)
Backport of #103372 and #104016 to release/8.0-staging
## Customer Impact
- [X] Customer reported (#100602)
- [ ] Found internally
Customers developing Android apps are currently unable to use mutual TLS authentication in certain cases as the `SslStreamCertificateContext.Create(...)` method will fail to build an X509Chain instance if the certificate isn't trusted by the OS due to the limitations of the Android platform.
## Regression
- [ ] Yes
- [X] No
## Testing
Unit tests and manual testing on Android emulator.
## Risk
Low. The change is mostly limited to Android where this API doesn't currently work in many cases. ---------
Co-authored-by: Tomas Weinfurt <tweinfurt@yahoo.com>
Co-authored-by: Vitek Karas <10670590+vitek-karas@users.noreply.github.com>
@github-actionsgithub-actionsBot locked and limited conversation to collaborators Jul 29, 2024
@karelzkarelz added this to the 9.0.0 milestone Sep 3, 2024
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[Android] PlatformNotSupported failures inside System.Net.Security.Tests

6 participants

@simonrozsival@bartonjs@wfurt@rzikm@matouskozak@karelz
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

[Android] Fix SslStreamCertificateContext empty custom trust store exception - #104016

Merged
simonrozsival merged 5 commits into
dotnet:mainfrom
simonrozsival:fix-sslstreamcertificatecontext-android
Jun 28, 2024
Merged

[Android] Fix SslStreamCertificateContext empty custom trust store exception#104016
simonrozsival merged 5 commits into
dotnet:mainfrom
simonrozsival:fix-sslstreamcertificatecontext-android

Conversation

@simonrozsival

Copy link
Copy Markdown
Member

Closes#104010
Follow-up to #103372

When building the chain, we should not only check if the trust or additional certificate collections aren't null but also if they're not empty.

It is now also possible to enable one of the disabled Android tests (#68206).

/cc @matouskozak@wfurt

@simonrozsival

Copy link
Copy Markdown
MemberAuthor

/azp run runtime-extra-platforms

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines successfully started running 1 pipeline(s).

@dotnet-policy-service

Copy link
Copy Markdown
Contributor

Tagging subscribers to this area: @dotnet/ncl, @bartonjs, @vcsjones
See info in area-owners.md if you want to be subscribed.

@rzikmrzikm left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM

@matouskozakmatouskozak left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thank you for the quick fix! It looks like there are still failures on arm Androids, however I don't think they are related. I created a new tracking issue for them #104030

@wfurtwfurt left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM

}

if (trust != null)
if (trust?._store?.Certificates.Count > 0)

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The Certificates property on X509Store reads the store live and instantiates all the certificates. Using it in this manner throws a bunch of data at the GC and finalizer queue. And has a ToC/ToU bug, as it could still end up as empty on line 60.

if (trust._trustList != null)
{
chain.ChainPolicy.CustomTrustStore.AddRange(trust._trustList);
}

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I recommend returning to the previous pattern of just calling AddRange.

Then, you can decide to only change the custom trust mode if chain.ChainPolicy.CustomTrustStore is not empty:

if(chain.ChainPolicy.CustomTrustStore.Count>0){chain.ChainPolicy.TrustMode=X509ChainTrustMode.CustomRootTrust;}

@bartonjsbartonjsJun 26, 2024

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It's not intuitive to me, though, that we'd let "I said empty custom trust" mean "so use system trust" on Android, but mean "so nothing is trusted" on other platforms.

The trust being specified as empty should really manifest as an error here, or somewhere else, not mean "just do something different".

Nevermind. I see that this chain build is just to get the issuer/issuee relationships, and that there're no revocation checks and all verification errors are suppressed.

@simonrozsival

Copy link
Copy Markdown
MemberAuthor

/azp run runtime-extra-platforms

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines successfully started running 1 pipeline(s).

@simonrozsival

Copy link
Copy Markdown
MemberAuthor

/azp run runtime-extra-platforms

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines successfully started running 1 pipeline(s).

@simonrozsival

Copy link
Copy Markdown
MemberAuthor

The failing tests in runtime-extra-platforms are all unrelated

@simonrozsival
simonrozsival merged commit 8a3e603 into dotnet:mainJun 28, 2024
@simonrozsival
simonrozsival deleted the fix-sslstreamcertificatecontext-android branch June 28, 2024 10:34
simonrozsival added a commit to simonrozsival/runtime that referenced this pull request Jul 8, 2024
…ception (dotnet#104016)
* Check if certificate collections are not empty before changing trust mode to custom root trust
* Enable SslStream_ClientCertificateContext_SendsChain test on Android
* Apply suggestions from reviews
* Avoid unnecessary allocations
vitek-karas added a commit that referenced this pull request Jul 15, 2024
…CertificateContext (#104541)
Backport of #103372 and #104016 to release/8.0-staging
## Customer Impact
- [X] Customer reported (#100602)
- [ ] Found internally
Customers developing Android apps are currently unable to use mutual TLS authentication in certain cases as the `SslStreamCertificateContext.Create(...)` method will fail to build an X509Chain instance if the certificate isn't trusted by the OS due to the limitations of the Android platform.
## Regression
- [ ] Yes
- [X] No
## Testing
Unit tests and manual testing on Android emulator.
## Risk
Low. The change is mostly limited to Android where this API doesn't currently work in many cases. ---------
Co-authored-by: Tomas Weinfurt <tweinfurt@yahoo.com>
Co-authored-by: Vitek Karas <10670590+vitek-karas@users.noreply.github.com>
@github-actionsgithub-actionsBot locked and limited conversation to collaborators Jul 29, 2024
@karelzkarelz added this to the 9.0.0 milestone Sep 3, 2024
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[Android] PlatformNotSupported failures inside System.Net.Security.Tests

6 participants

@simonrozsival@bartonjs@wfurt@rzikm@matouskozak@karelz
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

[Android] Fix SslStreamCertificateContext empty custom trust store exception - #104016

Merged
simonrozsival merged 5 commits into
dotnet:mainfrom
simonrozsival:fix-sslstreamcertificatecontext-android
Jun 28, 2024
Merged

[Android] Fix SslStreamCertificateContext empty custom trust store exception#104016
simonrozsival merged 5 commits into
dotnet:mainfrom
simonrozsival:fix-sslstreamcertificatecontext-android

Conversation

@simonrozsival

Copy link
Copy Markdown
Member

Closes#104010
Follow-up to #103372

When building the chain, we should not only check if the trust or additional certificate collections aren't null but also if they're not empty.

It is now also possible to enable one of the disabled Android tests (#68206).

/cc @matouskozak@wfurt

@simonrozsival

Copy link
Copy Markdown
MemberAuthor

/azp run runtime-extra-platforms

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines successfully started running 1 pipeline(s).

@dotnet-policy-service

Copy link
Copy Markdown
Contributor

Tagging subscribers to this area: @dotnet/ncl, @bartonjs, @vcsjones
See info in area-owners.md if you want to be subscribed.

@rzikmrzikm left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM

@matouskozakmatouskozak left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thank you for the quick fix! It looks like there are still failures on arm Androids, however I don't think they are related. I created a new tracking issue for them #104030

@wfurtwfurt left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM

}

if (trust != null)
if (trust?._store?.Certificates.Count > 0)

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The Certificates property on X509Store reads the store live and instantiates all the certificates. Using it in this manner throws a bunch of data at the GC and finalizer queue. And has a ToC/ToU bug, as it could still end up as empty on line 60.

if (trust._trustList != null)
{
chain.ChainPolicy.CustomTrustStore.AddRange(trust._trustList);
}

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I recommend returning to the previous pattern of just calling AddRange.

Then, you can decide to only change the custom trust mode if chain.ChainPolicy.CustomTrustStore is not empty:

if(chain.ChainPolicy.CustomTrustStore.Count>0){chain.ChainPolicy.TrustMode=X509ChainTrustMode.CustomRootTrust;}

@bartonjsbartonjsJun 26, 2024

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It's not intuitive to me, though, that we'd let "I said empty custom trust" mean "so use system trust" on Android, but mean "so nothing is trusted" on other platforms.

The trust being specified as empty should really manifest as an error here, or somewhere else, not mean "just do something different".

Nevermind. I see that this chain build is just to get the issuer/issuee relationships, and that there're no revocation checks and all verification errors are suppressed.

@simonrozsival

Copy link
Copy Markdown
MemberAuthor

/azp run runtime-extra-platforms

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines successfully started running 1 pipeline(s).

@simonrozsival

Copy link
Copy Markdown
MemberAuthor

/azp run runtime-extra-platforms

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines successfully started running 1 pipeline(s).

@simonrozsival

Copy link
Copy Markdown
MemberAuthor

The failing tests in runtime-extra-platforms are all unrelated

@simonrozsival
simonrozsival merged commit 8a3e603 into dotnet:mainJun 28, 2024
@simonrozsival
simonrozsival deleted the fix-sslstreamcertificatecontext-android branch June 28, 2024 10:34
simonrozsival added a commit to simonrozsival/runtime that referenced this pull request Jul 8, 2024
…ception (dotnet#104016)
* Check if certificate collections are not empty before changing trust mode to custom root trust
* Enable SslStream_ClientCertificateContext_SendsChain test on Android
* Apply suggestions from reviews
* Avoid unnecessary allocations
vitek-karas added a commit that referenced this pull request Jul 15, 2024
…CertificateContext (#104541)
Backport of #103372 and #104016 to release/8.0-staging
## Customer Impact
- [X] Customer reported (#100602)
- [ ] Found internally
Customers developing Android apps are currently unable to use mutual TLS authentication in certain cases as the `SslStreamCertificateContext.Create(...)` method will fail to build an X509Chain instance if the certificate isn't trusted by the OS due to the limitations of the Android platform.
## Regression
- [ ] Yes
- [X] No
## Testing
Unit tests and manual testing on Android emulator.
## Risk
Low. The change is mostly limited to Android where this API doesn't currently work in many cases. ---------
Co-authored-by: Tomas Weinfurt <tweinfurt@yahoo.com>
Co-authored-by: Vitek Karas <10670590+vitek-karas@users.noreply.github.com>
@github-actionsgithub-actionsBot locked and limited conversation to collaborators Jul 29, 2024
@karelzkarelz added this to the 9.0.0 milestone Sep 3, 2024
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[Android] PlatformNotSupported failures inside System.Net.Security.Tests

6 participants

@simonrozsival@bartonjs@wfurt@rzikm@matouskozak@karelz
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

[Android] Fix SslStreamCertificateContext empty custom trust store exception - #104016

Merged
simonrozsival merged 5 commits into
dotnet:mainfrom
simonrozsival:fix-sslstreamcertificatecontext-android
Jun 28, 2024
Merged

[Android] Fix SslStreamCertificateContext empty custom trust store exception#104016
simonrozsival merged 5 commits into
dotnet:mainfrom
simonrozsival:fix-sslstreamcertificatecontext-android

Conversation

@simonrozsival

Copy link
Copy Markdown
Member

Closes#104010
Follow-up to #103372

When building the chain, we should not only check if the trust or additional certificate collections aren't null but also if they're not empty.

It is now also possible to enable one of the disabled Android tests (#68206).

/cc @matouskozak@wfurt

@simonrozsival

Copy link
Copy Markdown
MemberAuthor

/azp run runtime-extra-platforms

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines successfully started running 1 pipeline(s).

@dotnet-policy-service

Copy link
Copy Markdown
Contributor

Tagging subscribers to this area: @dotnet/ncl, @bartonjs, @vcsjones
See info in area-owners.md if you want to be subscribed.

@rzikmrzikm left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM

@matouskozakmatouskozak left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thank you for the quick fix! It looks like there are still failures on arm Androids, however I don't think they are related. I created a new tracking issue for them #104030

@wfurtwfurt left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM

}

if (trust != null)
if (trust?._store?.Certificates.Count > 0)

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The Certificates property on X509Store reads the store live and instantiates all the certificates. Using it in this manner throws a bunch of data at the GC and finalizer queue. And has a ToC/ToU bug, as it could still end up as empty on line 60.

if (trust._trustList != null)
{
chain.ChainPolicy.CustomTrustStore.AddRange(trust._trustList);
}

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I recommend returning to the previous pattern of just calling AddRange.

Then, you can decide to only change the custom trust mode if chain.ChainPolicy.CustomTrustStore is not empty:

if(chain.ChainPolicy.CustomTrustStore.Count>0){chain.ChainPolicy.TrustMode=X509ChainTrustMode.CustomRootTrust;}

@bartonjsbartonjsJun 26, 2024

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It's not intuitive to me, though, that we'd let "I said empty custom trust" mean "so use system trust" on Android, but mean "so nothing is trusted" on other platforms.

The trust being specified as empty should really manifest as an error here, or somewhere else, not mean "just do something different".

Nevermind. I see that this chain build is just to get the issuer/issuee relationships, and that there're no revocation checks and all verification errors are suppressed.

@simonrozsival

Copy link
Copy Markdown
MemberAuthor

/azp run runtime-extra-platforms

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines successfully started running 1 pipeline(s).

@simonrozsival

Copy link
Copy Markdown
MemberAuthor

/azp run runtime-extra-platforms

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines successfully started running 1 pipeline(s).

@simonrozsival

Copy link
Copy Markdown
MemberAuthor

The failing tests in runtime-extra-platforms are all unrelated

@simonrozsival
simonrozsival merged commit 8a3e603 into dotnet:mainJun 28, 2024
@simonrozsival
simonrozsival deleted the fix-sslstreamcertificatecontext-android branch June 28, 2024 10:34
simonrozsival added a commit to simonrozsival/runtime that referenced this pull request Jul 8, 2024
…ception (dotnet#104016)
* Check if certificate collections are not empty before changing trust mode to custom root trust
* Enable SslStream_ClientCertificateContext_SendsChain test on Android
* Apply suggestions from reviews
* Avoid unnecessary allocations
vitek-karas added a commit that referenced this pull request Jul 15, 2024
…CertificateContext (#104541)
Backport of #103372 and #104016 to release/8.0-staging
## Customer Impact
- [X] Customer reported (#100602)
- [ ] Found internally
Customers developing Android apps are currently unable to use mutual TLS authentication in certain cases as the `SslStreamCertificateContext.Create(...)` method will fail to build an X509Chain instance if the certificate isn't trusted by the OS due to the limitations of the Android platform.
## Regression
- [ ] Yes
- [X] No
## Testing
Unit tests and manual testing on Android emulator.
## Risk
Low. The change is mostly limited to Android where this API doesn't currently work in many cases. ---------
Co-authored-by: Tomas Weinfurt <tweinfurt@yahoo.com>
Co-authored-by: Vitek Karas <10670590+vitek-karas@users.noreply.github.com>
@github-actionsgithub-actionsBot locked and limited conversation to collaborators Jul 29, 2024
@karelzkarelz added this to the 9.0.0 milestone Sep 3, 2024
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[Android] PlatformNotSupported failures inside System.Net.Security.Tests

6 participants

@simonrozsival@bartonjs@wfurt@rzikm@matouskozak@karelz
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

[Android] Fix SslStreamCertificateContext empty custom trust store exception - #104016

Merged
simonrozsival merged 5 commits into
dotnet:mainfrom
simonrozsival:fix-sslstreamcertificatecontext-android
Jun 28, 2024
Merged

[Android] Fix SslStreamCertificateContext empty custom trust store exception#104016
simonrozsival merged 5 commits into
dotnet:mainfrom
simonrozsival:fix-sslstreamcertificatecontext-android

Conversation

@simonrozsival

Copy link
Copy Markdown
Member

Closes#104010
Follow-up to #103372

When building the chain, we should not only check if the trust or additional certificate collections aren't null but also if they're not empty.

It is now also possible to enable one of the disabled Android tests (#68206).

/cc @matouskozak@wfurt

@simonrozsival

Copy link
Copy Markdown
MemberAuthor

/azp run runtime-extra-platforms

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines successfully started running 1 pipeline(s).

@dotnet-policy-service

Copy link
Copy Markdown
Contributor

Tagging subscribers to this area: @dotnet/ncl, @bartonjs, @vcsjones
See info in area-owners.md if you want to be subscribed.

@rzikmrzikm left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM

@matouskozakmatouskozak left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thank you for the quick fix! It looks like there are still failures on arm Androids, however I don't think they are related. I created a new tracking issue for them #104030

@wfurtwfurt left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM

}

if (trust != null)
if (trust?._store?.Certificates.Count > 0)

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The Certificates property on X509Store reads the store live and instantiates all the certificates. Using it in this manner throws a bunch of data at the GC and finalizer queue. And has a ToC/ToU bug, as it could still end up as empty on line 60.

if (trust._trustList != null)
{
chain.ChainPolicy.CustomTrustStore.AddRange(trust._trustList);
}

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I recommend returning to the previous pattern of just calling AddRange.

Then, you can decide to only change the custom trust mode if chain.ChainPolicy.CustomTrustStore is not empty:

if(chain.ChainPolicy.CustomTrustStore.Count>0){chain.ChainPolicy.TrustMode=X509ChainTrustMode.CustomRootTrust;}

@bartonjsbartonjsJun 26, 2024

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It's not intuitive to me, though, that we'd let "I said empty custom trust" mean "so use system trust" on Android, but mean "so nothing is trusted" on other platforms.

The trust being specified as empty should really manifest as an error here, or somewhere else, not mean "just do something different".

Nevermind. I see that this chain build is just to get the issuer/issuee relationships, and that there're no revocation checks and all verification errors are suppressed.

@simonrozsival

Copy link
Copy Markdown
MemberAuthor

/azp run runtime-extra-platforms

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines successfully started running 1 pipeline(s).

@simonrozsival

Copy link
Copy Markdown
MemberAuthor

/azp run runtime-extra-platforms

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines successfully started running 1 pipeline(s).

@simonrozsival

Copy link
Copy Markdown
MemberAuthor

The failing tests in runtime-extra-platforms are all unrelated

@simonrozsival
simonrozsival merged commit 8a3e603 into dotnet:mainJun 28, 2024
@simonrozsival
simonrozsival deleted the fix-sslstreamcertificatecontext-android branch June 28, 2024 10:34
simonrozsival added a commit to simonrozsival/runtime that referenced this pull request Jul 8, 2024
…ception (dotnet#104016)
* Check if certificate collections are not empty before changing trust mode to custom root trust
* Enable SslStream_ClientCertificateContext_SendsChain test on Android
* Apply suggestions from reviews
* Avoid unnecessary allocations
vitek-karas added a commit that referenced this pull request Jul 15, 2024
…CertificateContext (#104541)
Backport of #103372 and #104016 to release/8.0-staging
## Customer Impact
- [X] Customer reported (#100602)
- [ ] Found internally
Customers developing Android apps are currently unable to use mutual TLS authentication in certain cases as the `SslStreamCertificateContext.Create(...)` method will fail to build an X509Chain instance if the certificate isn't trusted by the OS due to the limitations of the Android platform.
## Regression
- [ ] Yes
- [X] No
## Testing
Unit tests and manual testing on Android emulator.
## Risk
Low. The change is mostly limited to Android where this API doesn't currently work in many cases. ---------
Co-authored-by: Tomas Weinfurt <tweinfurt@yahoo.com>
Co-authored-by: Vitek Karas <10670590+vitek-karas@users.noreply.github.com>
@github-actionsgithub-actionsBot locked and limited conversation to collaborators Jul 29, 2024
@karelzkarelz added this to the 9.0.0 milestone Sep 3, 2024
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[Android] PlatformNotSupported failures inside System.Net.Security.Tests

6 participants

@simonrozsival@bartonjs@wfurt@rzikm@matouskozak@karelz
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

[Android] Fix SslStreamCertificateContext empty custom trust store exception - #104016

Merged
simonrozsival merged 5 commits into
dotnet:mainfrom
simonrozsival:fix-sslstreamcertificatecontext-android
Jun 28, 2024
Merged

[Android] Fix SslStreamCertificateContext empty custom trust store exception#104016
simonrozsival merged 5 commits into
dotnet:mainfrom
simonrozsival:fix-sslstreamcertificatecontext-android

Conversation

@simonrozsival

Copy link
Copy Markdown
Member

Closes#104010
Follow-up to #103372

When building the chain, we should not only check if the trust or additional certificate collections aren't null but also if they're not empty.

It is now also possible to enable one of the disabled Android tests (#68206).

/cc @matouskozak@wfurt

@simonrozsival

Copy link
Copy Markdown
MemberAuthor

/azp run runtime-extra-platforms

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines successfully started running 1 pipeline(s).

@dotnet-policy-service

Copy link
Copy Markdown
Contributor

Tagging subscribers to this area: @dotnet/ncl, @bartonjs, @vcsjones
See info in area-owners.md if you want to be subscribed.

@rzikmrzikm left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM

@matouskozakmatouskozak left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thank you for the quick fix! It looks like there are still failures on arm Androids, however I don't think they are related. I created a new tracking issue for them #104030

@wfurtwfurt left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM

}

if (trust != null)
if (trust?._store?.Certificates.Count > 0)

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The Certificates property on X509Store reads the store live and instantiates all the certificates. Using it in this manner throws a bunch of data at the GC and finalizer queue. And has a ToC/ToU bug, as it could still end up as empty on line 60.

if (trust._trustList != null)
{
chain.ChainPolicy.CustomTrustStore.AddRange(trust._trustList);
}

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I recommend returning to the previous pattern of just calling AddRange.

Then, you can decide to only change the custom trust mode if chain.ChainPolicy.CustomTrustStore is not empty:

if(chain.ChainPolicy.CustomTrustStore.Count>0){chain.ChainPolicy.TrustMode=X509ChainTrustMode.CustomRootTrust;}

@bartonjsbartonjsJun 26, 2024

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It's not intuitive to me, though, that we'd let "I said empty custom trust" mean "so use system trust" on Android, but mean "so nothing is trusted" on other platforms.

The trust being specified as empty should really manifest as an error here, or somewhere else, not mean "just do something different".

Nevermind. I see that this chain build is just to get the issuer/issuee relationships, and that there're no revocation checks and all verification errors are suppressed.

@simonrozsival

Copy link
Copy Markdown
MemberAuthor

/azp run runtime-extra-platforms

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines successfully started running 1 pipeline(s).

@simonrozsival

Copy link
Copy Markdown
MemberAuthor

/azp run runtime-extra-platforms

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines successfully started running 1 pipeline(s).

@simonrozsival

Copy link
Copy Markdown
MemberAuthor

The failing tests in runtime-extra-platforms are all unrelated

@simonrozsival
simonrozsival merged commit 8a3e603 into dotnet:mainJun 28, 2024
@simonrozsival
simonrozsival deleted the fix-sslstreamcertificatecontext-android branch June 28, 2024 10:34
simonrozsival added a commit to simonrozsival/runtime that referenced this pull request Jul 8, 2024
…ception (dotnet#104016)
* Check if certificate collections are not empty before changing trust mode to custom root trust
* Enable SslStream_ClientCertificateContext_SendsChain test on Android
* Apply suggestions from reviews
* Avoid unnecessary allocations
vitek-karas added a commit that referenced this pull request Jul 15, 2024
…CertificateContext (#104541)
Backport of #103372 and #104016 to release/8.0-staging
## Customer Impact
- [X] Customer reported (#100602)
- [ ] Found internally
Customers developing Android apps are currently unable to use mutual TLS authentication in certain cases as the `SslStreamCertificateContext.Create(...)` method will fail to build an X509Chain instance if the certificate isn't trusted by the OS due to the limitations of the Android platform.
## Regression
- [ ] Yes
- [X] No
## Testing
Unit tests and manual testing on Android emulator.
## Risk
Low. The change is mostly limited to Android where this API doesn't currently work in many cases. ---------
Co-authored-by: Tomas Weinfurt <tweinfurt@yahoo.com>
Co-authored-by: Vitek Karas <10670590+vitek-karas@users.noreply.github.com>
@github-actionsgithub-actionsBot locked and limited conversation to collaborators Jul 29, 2024
@karelzkarelz added this to the 9.0.0 milestone Sep 3, 2024
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[Android] PlatformNotSupported failures inside System.Net.Security.Tests

6 participants

@simonrozsival@bartonjs@wfurt@rzikm@matouskozak@karelz
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

[Android] Fix SslStreamCertificateContext empty custom trust store exception - #104016

Merged
simonrozsival merged 5 commits into
dotnet:mainfrom
simonrozsival:fix-sslstreamcertificatecontext-android
Jun 28, 2024
Merged

[Android] Fix SslStreamCertificateContext empty custom trust store exception#104016
simonrozsival merged 5 commits into
dotnet:mainfrom
simonrozsival:fix-sslstreamcertificatecontext-android

Conversation

@simonrozsival

Copy link
Copy Markdown
Member

Closes#104010
Follow-up to #103372

When building the chain, we should not only check if the trust or additional certificate collections aren't null but also if they're not empty.

It is now also possible to enable one of the disabled Android tests (#68206).

/cc @matouskozak@wfurt

@simonrozsival

Copy link
Copy Markdown
MemberAuthor

/azp run runtime-extra-platforms

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines successfully started running 1 pipeline(s).

@dotnet-policy-service

Copy link
Copy Markdown
Contributor

Tagging subscribers to this area: @dotnet/ncl, @bartonjs, @vcsjones
See info in area-owners.md if you want to be subscribed.

@rzikmrzikm left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM

@matouskozakmatouskozak left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thank you for the quick fix! It looks like there are still failures on arm Androids, however I don't think they are related. I created a new tracking issue for them #104030

@wfurtwfurt left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM

}

if (trust != null)
if (trust?._store?.Certificates.Count > 0)

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The Certificates property on X509Store reads the store live and instantiates all the certificates. Using it in this manner throws a bunch of data at the GC and finalizer queue. And has a ToC/ToU bug, as it could still end up as empty on line 60.

if (trust._trustList != null)
{
chain.ChainPolicy.CustomTrustStore.AddRange(trust._trustList);
}

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I recommend returning to the previous pattern of just calling AddRange.

Then, you can decide to only change the custom trust mode if chain.ChainPolicy.CustomTrustStore is not empty:

if(chain.ChainPolicy.CustomTrustStore.Count>0){chain.ChainPolicy.TrustMode=X509ChainTrustMode.CustomRootTrust;}

@bartonjsbartonjsJun 26, 2024

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It's not intuitive to me, though, that we'd let "I said empty custom trust" mean "so use system trust" on Android, but mean "so nothing is trusted" on other platforms.

The trust being specified as empty should really manifest as an error here, or somewhere else, not mean "just do something different".

Nevermind. I see that this chain build is just to get the issuer/issuee relationships, and that there're no revocation checks and all verification errors are suppressed.

@simonrozsival

Copy link
Copy Markdown
MemberAuthor

/azp run runtime-extra-platforms

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines successfully started running 1 pipeline(s).

@simonrozsival

Copy link
Copy Markdown
MemberAuthor

/azp run runtime-extra-platforms

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines successfully started running 1 pipeline(s).

@simonrozsival

Copy link
Copy Markdown
MemberAuthor

The failing tests in runtime-extra-platforms are all unrelated

@simonrozsival
simonrozsival merged commit 8a3e603 into dotnet:mainJun 28, 2024
@simonrozsival
simonrozsival deleted the fix-sslstreamcertificatecontext-android branch June 28, 2024 10:34
simonrozsival added a commit to simonrozsival/runtime that referenced this pull request Jul 8, 2024
…ception (dotnet#104016)
* Check if certificate collections are not empty before changing trust mode to custom root trust
* Enable SslStream_ClientCertificateContext_SendsChain test on Android
* Apply suggestions from reviews
* Avoid unnecessary allocations
vitek-karas added a commit that referenced this pull request Jul 15, 2024
…CertificateContext (#104541)
Backport of #103372 and #104016 to release/8.0-staging
## Customer Impact
- [X] Customer reported (#100602)
- [ ] Found internally
Customers developing Android apps are currently unable to use mutual TLS authentication in certain cases as the `SslStreamCertificateContext.Create(...)` method will fail to build an X509Chain instance if the certificate isn't trusted by the OS due to the limitations of the Android platform.
## Regression
- [ ] Yes
- [X] No
## Testing
Unit tests and manual testing on Android emulator.
## Risk
Low. The change is mostly limited to Android where this API doesn't currently work in many cases. ---------
Co-authored-by: Tomas Weinfurt <tweinfurt@yahoo.com>
Co-authored-by: Vitek Karas <10670590+vitek-karas@users.noreply.github.com>
@github-actionsgithub-actionsBot locked and limited conversation to collaborators Jul 29, 2024
@karelzkarelz added this to the 9.0.0 milestone Sep 3, 2024
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[Android] PlatformNotSupported failures inside System.Net.Security.Tests

6 participants

@simonrozsival@bartonjs@wfurt@rzikm@matouskozak@karelz
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

[Android] Fix SslStreamCertificateContext empty custom trust store exception - #104016

Merged
simonrozsival merged 5 commits into
dotnet:mainfrom
simonrozsival:fix-sslstreamcertificatecontext-android
Jun 28, 2024
Merged

[Android] Fix SslStreamCertificateContext empty custom trust store exception#104016
simonrozsival merged 5 commits into
dotnet:mainfrom
simonrozsival:fix-sslstreamcertificatecontext-android

Conversation

@simonrozsival

Copy link
Copy Markdown
Member

Closes#104010
Follow-up to #103372

When building the chain, we should not only check if the trust or additional certificate collections aren't null but also if they're not empty.

It is now also possible to enable one of the disabled Android tests (#68206).

/cc @matouskozak@wfurt

@simonrozsival

Copy link
Copy Markdown
MemberAuthor

/azp run runtime-extra-platforms

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines successfully started running 1 pipeline(s).

@dotnet-policy-service

Copy link
Copy Markdown
Contributor

Tagging subscribers to this area: @dotnet/ncl, @bartonjs, @vcsjones
See info in area-owners.md if you want to be subscribed.

@rzikmrzikm left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM

@matouskozakmatouskozak left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thank you for the quick fix! It looks like there are still failures on arm Androids, however I don't think they are related. I created a new tracking issue for them #104030

@wfurtwfurt left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM

}

if (trust != null)
if (trust?._store?.Certificates.Count > 0)

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The Certificates property on X509Store reads the store live and instantiates all the certificates. Using it in this manner throws a bunch of data at the GC and finalizer queue. And has a ToC/ToU bug, as it could still end up as empty on line 60.

if (trust._trustList != null)
{
chain.ChainPolicy.CustomTrustStore.AddRange(trust._trustList);
}

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I recommend returning to the previous pattern of just calling AddRange.

Then, you can decide to only change the custom trust mode if chain.ChainPolicy.CustomTrustStore is not empty:

if(chain.ChainPolicy.CustomTrustStore.Count>0){chain.ChainPolicy.TrustMode=X509ChainTrustMode.CustomRootTrust;}

@bartonjsbartonjsJun 26, 2024

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It's not intuitive to me, though, that we'd let "I said empty custom trust" mean "so use system trust" on Android, but mean "so nothing is trusted" on other platforms.

The trust being specified as empty should really manifest as an error here, or somewhere else, not mean "just do something different".

Nevermind. I see that this chain build is just to get the issuer/issuee relationships, and that there're no revocation checks and all verification errors are suppressed.

@simonrozsival

Copy link
Copy Markdown
MemberAuthor

/azp run runtime-extra-platforms

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines successfully started running 1 pipeline(s).

@simonrozsival

Copy link
Copy Markdown
MemberAuthor

/azp run runtime-extra-platforms

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines successfully started running 1 pipeline(s).

@simonrozsival

Copy link
Copy Markdown
MemberAuthor

The failing tests in runtime-extra-platforms are all unrelated

@simonrozsival
simonrozsival merged commit 8a3e603 into dotnet:mainJun 28, 2024
@simonrozsival
simonrozsival deleted the fix-sslstreamcertificatecontext-android branch June 28, 2024 10:34
simonrozsival added a commit to simonrozsival/runtime that referenced this pull request Jul 8, 2024
…ception (dotnet#104016)
* Check if certificate collections are not empty before changing trust mode to custom root trust
* Enable SslStream_ClientCertificateContext_SendsChain test on Android
* Apply suggestions from reviews
* Avoid unnecessary allocations
vitek-karas added a commit that referenced this pull request Jul 15, 2024
…CertificateContext (#104541)
Backport of #103372 and #104016 to release/8.0-staging
## Customer Impact
- [X] Customer reported (#100602)
- [ ] Found internally
Customers developing Android apps are currently unable to use mutual TLS authentication in certain cases as the `SslStreamCertificateContext.Create(...)` method will fail to build an X509Chain instance if the certificate isn't trusted by the OS due to the limitations of the Android platform.
## Regression
- [ ] Yes
- [X] No
## Testing
Unit tests and manual testing on Android emulator.
## Risk
Low. The change is mostly limited to Android where this API doesn't currently work in many cases. ---------
Co-authored-by: Tomas Weinfurt <tweinfurt@yahoo.com>
Co-authored-by: Vitek Karas <10670590+vitek-karas@users.noreply.github.com>
@github-actionsgithub-actionsBot locked and limited conversation to collaborators Jul 29, 2024
@karelzkarelz added this to the 9.0.0 milestone Sep 3, 2024
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[Android] PlatformNotSupported failures inside System.Net.Security.Tests

6 participants

@simonrozsival@bartonjs@wfurt@rzikm@matouskozak@karelz