Quite often, you can't connect to an SSL site because .NET will tell you that the certificate is invalid.
This openssl command shows you the certificate errors:
openssl s_client -connect company.co.nz:443|openssl x509 -text
The output looks like:
depth=2 CN = Company Root CA
verify error:num=19:self signed certificate in certificate chain
Certificate:
Data:
Version: 3 (0x2)
Serial Number:
1f:06:eb:c1:00:34:00:05:56:38
...
etc.
It also checks the intermediate and root CA certificate validation chain.
Enjoy!
Ideas and thoughts about Microsoft Identity, C# development, cabbages and kings and random flotsam on the incoming tide
Showing posts with label Certificates. Show all posts
Showing posts with label Certificates. Show all posts
Thursday, July 12, 2018
Friday, July 06, 2018
Certificates : The remote certificate is invalid according to the validation procedure
I see this error so many times. It is generally on the client side as part of the .NET framework.
The root cause of this is:
The Network Service account must be able to write to this log so give the account access to the directory.
The root cause of this is:
- Your server certificate is self-signed
- You are using an incorrect host name to connect
- Your certificate is not trusted
The host name must match the subject name on the certificate e.g. company.com and orders.company.com both point to the same URL but the certificate has been issued to company.com. So that is the name you need to use to get to the web site. Or else you can add the other names to the SAN.
If the certificate is not trusted, you can add it to the "Trusted Root Certification Authorities". But be mindful of security.
I find it useful to log why .NET doesn't like it.
Just in case that article disappears, I've saved the config here.
Key info:
Change the log location.
e.g. initializeData="c:\Logs\Trace.log"
Now assume that company.com is not in the DNS and you have an IP address e.g. 124.40.60.80.
Now the URL is 124.40.60.80 but the certificate subject name is company.com. Bingo. You get the error.
The solution is to create a host file entry.
124.40.60.80 company.com
Now you can browse to company.com and the name will match.
Enjoy!
Thursday, March 29, 2018
Certificates : Removing a certificate store folder
I created the wrong folder using makecert and you can't remove it using "mmc".
Then I found this post.
void Main()
{
int CERT_SYSTEM_STORE_LOCATION_SHIFT = 16;
uint CERT_SYSTEM_STORE_CURRENT_USER_ID = 1;
uint CERT_SYSTEM_STORE_LOCAL_MACHINE_ID = 2;
uint CERT_STORE_DELETE_FLAG = 0x10;
uint CERT_SYSTEM_STORE_CURRENT_USER = CERT_SYSTEM_STORE_CURRENT_USER_ID << CERT_SYSTEM_STORE_LOCATION_SHIFT;
uint CERT_SYSTEM_STORE_LOCAL_MACHINE = CERT_SYSTEM_STORE_LOCAL_MACHINE_ID << CERT_SYSTEM_STORE_LOCATION_SHIFT;
CertUnregisterSystemStore("makecert", CERT_STORE_DELETE_FLAG | CERT_SYSTEM_STORE_CURRENT_USER);
}
[DllImport("crypt32.dll", CharSet = CharSet.Unicode)]
public static extern bool CertUnregisterSystemStore(string systemStore, uint flags);
Also need to add:
using System.Runtime.InteropServices;
and run in LINQPad as a "C# program".
Works for "Current User" but doesn't seem to work for "Local Computer".
Enjoy!
Then I found this post.
void Main()
{
int CERT_SYSTEM_STORE_LOCATION_SHIFT = 16;
uint CERT_SYSTEM_STORE_CURRENT_USER_ID = 1;
uint CERT_SYSTEM_STORE_LOCAL_MACHINE_ID = 2;
uint CERT_STORE_DELETE_FLAG = 0x10;
uint CERT_SYSTEM_STORE_CURRENT_USER = CERT_SYSTEM_STORE_CURRENT_USER_ID << CERT_SYSTEM_STORE_LOCATION_SHIFT;
uint CERT_SYSTEM_STORE_LOCAL_MACHINE = CERT_SYSTEM_STORE_LOCAL_MACHINE_ID << CERT_SYSTEM_STORE_LOCATION_SHIFT;
CertUnregisterSystemStore("makecert", CERT_STORE_DELETE_FLAG | CERT_SYSTEM_STORE_CURRENT_USER);
}
[DllImport("crypt32.dll", CharSet = CharSet.Unicode)]
public static extern bool CertUnregisterSystemStore(string systemStore, uint flags);
Also need to add:
using System.Runtime.InteropServices;
and run in LINQPad as a "C# program".
Works for "Current User" but doesn't seem to work for "Local Computer".
Enjoy!
Tuesday, March 20, 2018
Certificates : Getting the thumbprint via OpenSSL
I've been looking at AWS Cognito and keep coming across interesting snippets of how to do things.
Let's say you wanted the ADFS thumbprint for the SSL certificate.
You could do this via mmc or via the ADFS wizard or via the IIS binding.
You could also do:
openssl s_client -showcerts -connect my-adfs:443
Note: You just use the top-level ADFS URL - don't add /adfs/ls etc.
This displays:
Loading 'screen' into random state - done
CONNECTED(000005DC)
depth=0 CN = my-adfs
verify error:num=18:self signed certificate
verify return:1
depth=0 CN = my-adfs
verify return:1
---
Certificate chain
0 s:/CN=my-adfs
i:/CN=my-adfs
-----BEGIN CERTIFICATE-----
MIIExD...vLMng0
-----END CERTIFICATE-----
---
Server certificate
subject=/CN=my-adfs
issuer=/CN=my-adfs
---
No client certificate CA names sent
---
SSL handshake has read 1964 bytes and written 447 bytes
---
New, TLSv1/SSLv3, Cipher is ECDHE-RSA-AES256-GCM-SHA384
Server public key is 4096 bit
Secure Renegotiation IS supported
Compression: NONE
Expansion: NONE
SSL-Session:
Protocol : TLSv1.2
Cipher : ECDHE-RSA-AES256-GCM-SHA384
Session-ID: 29140000...E4D79A337F1F0BBC9
Session-ID-ctx:
Master-Key: 91E8...DE30CD
Key-Arg : None
PSK identity: None
PSK identity hint: None
SRP username: None
Start Time: 1521150875
Timeout : 300 (sec)
Verify return code: 18 (self signed certificate)
---
read:errno=10054
Copy / paste this section:
-----BEGIN CERTIFICATE-----
MIIExD...vLMng0
-----END CERTIFICATE-----
into a file called e.g. adfs.cer
Then:
openssl x509 -in c:\xxx\adfs.cer -fingerprint -noout
SHA1 Fingerprint=24:F8:...:9A:21:2B:35
Enjoy!
Let's say you wanted the ADFS thumbprint for the SSL certificate.
You could do this via mmc or via the ADFS wizard or via the IIS binding.
You could also do:
openssl s_client -showcerts -connect my-adfs:443
Note: You just use the top-level ADFS URL - don't add /adfs/ls etc.
This displays:
Loading 'screen' into random state - done
CONNECTED(000005DC)
depth=0 CN = my-adfs
verify error:num=18:self signed certificate
verify return:1
depth=0 CN = my-adfs
verify return:1
---
Certificate chain
0 s:/CN=my-adfs
i:/CN=my-adfs
-----BEGIN CERTIFICATE-----
MIIExD...vLMng0
-----END CERTIFICATE-----
---
Server certificate
subject=/CN=my-adfs
issuer=/CN=my-adfs
---
No client certificate CA names sent
---
SSL handshake has read 1964 bytes and written 447 bytes
---
New, TLSv1/SSLv3, Cipher is ECDHE-RSA-AES256-GCM-SHA384
Server public key is 4096 bit
Secure Renegotiation IS supported
Compression: NONE
Expansion: NONE
SSL-Session:
Protocol : TLSv1.2
Cipher : ECDHE-RSA-AES256-GCM-SHA384
Session-ID: 29140000...E4D79A337F1F0BBC9
Session-ID-ctx:
Master-Key: 91E8...DE30CD
Key-Arg : None
PSK identity: None
PSK identity hint: None
SRP username: None
Start Time: 1521150875
Timeout : 300 (sec)
Verify return code: 18 (self signed certificate)
---
read:errno=10054
Copy / paste this section:
-----BEGIN CERTIFICATE-----
MIIExD...vLMng0
-----END CERTIFICATE-----
into a file called e.g. adfs.cer
Then:
openssl x509 -in c:\xxx\adfs.cer -fingerprint -noout
SHA1 Fingerprint=24:F8:...:9A:21:2B:35
Enjoy!
Friday, January 12, 2018
Certificates : Finding a thumbprint and using PowerShell
I always use mmc as the wizard to manage certificates but I needed to do some certificate work and I wondered if there was a way of automating it.
Turns out you can with PowerShell.
Instead of \cd to a drive, you go to the certificate store with:
cd CERT:\\
Then:
PS Cert:\> dir
Location : CurrentUser
StoreNames : {ACRS, SmartCardRoot, Root, Trust...}
Location : LocalMachine
StoreNames : {TrustedPublisher, ClientAuthIssuer, Remote Desktop, Root...}
Then we can do things like:
dir .\\CurrentUser\My
dir .\\LocalMachine\My
which gives a list:
PSParentPath: Microsoft.PowerShell.Security\Certificate::LocalMachine\My
Thumbprint Subject
---------- -------
If we want to see the structure, we can do:
PS Cert:\currentuser> get-childitem
which gives:
Name : ACRS
Name : SmartCardRoot
Name : Root
Name : Trust
Name : AuthRoot
Name : CA
Name : UserDS
Name : Disallowed
Name : My
Name : TrustedPeople
Name : TrustedPublisher
Name : ClientAuthIssuer
If we want to find a certificate with a particular thumbprint, we can use:
Get-ChildItem -Path 'thumbprint' -recurs
which gives:
PS Cert:\> Get-ChildItem -Path 'CD...72' -recurse
PSParentPath: Microsoft.PowerShell.Security\Certificate::CurrentUser\Root
Thumbprint Subject
---------- -------
CD...72 CN=Microsoft Root Certificate Authority, DC=microsoft, DC=com
PSParentPath: Microsoft.PowerShell.Security\Certificate::LocalMachine\Root
Thumbprint Subject
---------- -------
CD...72 CN=Microsoft Root Certificate Authority, DC=microsoft, DC=com
or we can get a list:
Get-ChildItem -Path 'thumbprint' -recurse | Format-List -Property *
which gives:
PSPath : Microsoft.PowerShell.Security\Certificate::CurrentUser\Root\CD...72
PSParentPath : Microsoft.PowerShell.Security\Certificate::CurrentUser\Root
PSChildName : CD...72
PSDrive : Cert
PSProvider : Microsoft.PowerShell.Security\Certificate
PSIsContainer : False
EnhancedKeyUsageList : {}
DnsNameList : {Microsoft Root Certificate Authority}
SendAsTrustedIssuer : False
EnrollmentPolicyEndPoint : Microsoft.CertificateServices.Commands.EnrollmentEndPointProperty
EnrollmentServerEndPoint : Microsoft.CertificateServices.Commands.EnrollmentEndPointProperty
PolicyId :
Archived : False
Extensions : {System.Security.Cryptography.Oid, System.Security.Cryptography.Oid,
System.Security.Cryptography.Oid, System.Security.Cryptography.Oid}
FriendlyName : Microsoft Root Certificate Authority
IssuerName : System.Security.Cryptography.X509Certificates.X500DistinguishedName
NotAfter : 10/05/2031 11:28:13 AM
NotBefore : 10/05/2011 11:19:22 AM
HasPrivateKey : False
PrivateKey :
PublicKey : System.Security.Cryptography.X509Certificates.PublicKey
RawData : {48, ... 153}
SerialNumber : 79...65
SubjectName : System.Security.Cryptography.X509Certificates.X500DistinguishedName
SignatureAlgorithm : System.Security.Cryptography.Oid
Thumbprint : CD...72
Version : 3
Handle : 25...92
Issuer : CN=Microsoft Root Certificate Authority, DC=microsoft, DC=com
Subject : CN=Microsoft Root Certificate Authority, DC=microsoft, DC=com
Enjoy!
Turns out you can with PowerShell.
Instead of \cd to a drive, you go to the certificate store with:
cd CERT:\\
Then:
PS Cert:\> dir
Location : CurrentUser
StoreNames : {ACRS, SmartCardRoot, Root, Trust...}
Location : LocalMachine
StoreNames : {TrustedPublisher, ClientAuthIssuer, Remote Desktop, Root...}
Then we can do things like:
dir .\\CurrentUser\My
dir .\\LocalMachine\My
which gives a list:
PSParentPath: Microsoft.PowerShell.Security\Certificate::LocalMachine\My
Thumbprint Subject
---------- -------
If we want to see the structure, we can do:
PS Cert:\currentuser> get-childitem
which gives:
Name : ACRS
Name : SmartCardRoot
Name : Root
Name : Trust
Name : AuthRoot
Name : CA
Name : UserDS
Name : Disallowed
Name : My
Name : TrustedPeople
Name : TrustedPublisher
Name : ClientAuthIssuer
If we want to find a certificate with a particular thumbprint, we can use:
Get-ChildItem -Path 'thumbprint' -recurs
which gives:
PS Cert:\> Get-ChildItem -Path 'CD...72' -recurse
PSParentPath: Microsoft.PowerShell.Security\Certificate::CurrentUser\Root
Thumbprint Subject
---------- -------
CD...72 CN=Microsoft Root Certificate Authority, DC=microsoft, DC=com
PSParentPath: Microsoft.PowerShell.Security\Certificate::LocalMachine\Root
Thumbprint Subject
---------- -------
CD...72 CN=Microsoft Root Certificate Authority, DC=microsoft, DC=com
or we can get a list:
Get-ChildItem -Path 'thumbprint' -recurse | Format-List -Property *
which gives:
PSPath : Microsoft.PowerShell.Security\Certificate::CurrentUser\Root\CD...72
PSParentPath : Microsoft.PowerShell.Security\Certificate::CurrentUser\Root
PSChildName : CD...72
PSDrive : Cert
PSProvider : Microsoft.PowerShell.Security\Certificate
PSIsContainer : False
EnhancedKeyUsageList : {}
DnsNameList : {Microsoft Root Certificate Authority}
SendAsTrustedIssuer : False
EnrollmentPolicyEndPoint : Microsoft.CertificateServices.Commands.EnrollmentEndPointProperty
EnrollmentServerEndPoint : Microsoft.CertificateServices.Commands.EnrollmentEndPointProperty
PolicyId :
Archived : False
Extensions : {System.Security.Cryptography.Oid, System.Security.Cryptography.Oid,
System.Security.Cryptography.Oid, System.Security.Cryptography.Oid}
FriendlyName : Microsoft Root Certificate Authority
IssuerName : System.Security.Cryptography.X509Certificates.X500DistinguishedName
NotAfter : 10/05/2031 11:28:13 AM
NotBefore : 10/05/2011 11:19:22 AM
HasPrivateKey : False
PrivateKey :
PublicKey : System.Security.Cryptography.X509Certificates.PublicKey
RawData : {48, ... 153}
SerialNumber : 79...65
SubjectName : System.Security.Cryptography.X509Certificates.X500DistinguishedName
SignatureAlgorithm : System.Security.Cryptography.Oid
Thumbprint : CD...72
Version : 3
Handle : 25...92
Issuer : CN=Microsoft Root Certificate Authority, DC=microsoft, DC=com
Subject : CN=Microsoft Root Certificate Authority, DC=microsoft, DC=com
Enjoy!
Tuesday, September 15, 2015
Certificates : Getting User and Local Computer stores
For Windows 8 upwards, you can get this from the Modern Tiles method (thanks to Brady Gaster for the tip).
Search for user,cer and then click on "Manage user certificates".
You then get the "Current User" portion of the usual mmc plug-in.
Search for computer,cer and then click on "Manage computer certificates".
You then get the "Local Computer" portion of the usual mmc plug-in.
Enjoy!
Search for user,cer and then click on "Manage user certificates".
You then get the "Current User" portion of the usual mmc plug-in.
Search for computer,cer and then click on "Manage computer certificates".
You then get the "Local Computer" portion of the usual mmc plug-in.
Enjoy!
Certificates : Finding a certificate by the thumbprint (or other attributes)
I was having issues with a WIF web.config issue. The web.config had a thumbprint and I couldn't find the actual certificate in the ADFS server certificate store.
Duh - the ADFS encryption and signing certificates are not stored there if you use certificate rollover. They are apparently stored in the ADFS DB or in AD in a certificate container or .. There's a number of inconclusive posts on this matter.
But it did lead to me learning something about how to find a certificate from the thumbprint.
You you use the certificate plugin from mmc.
Right-click in the top level and then "Find Certificates".
Then you can put a thumbprint (or part of one) and search on "SHA1 Hash". There are other parameters you can search on as well.
You'll then get a list of the certificates that match and if you scroll over to the right, the stores that they are contained in.
Or you can use PowerShell from the root directory.
where the thumbprint is the one you are looking for.
Or you can use Raf's amazing utility "Deploy Manager":
DeployManager June 2011 edition
Just remember to run it in Admin. mode.
It bears repeating that you can also extract the certificates from the ADFS metadata.
ADFS : Getting certificate data from metadata
Enjoy!
Duh - the ADFS encryption and signing certificates are not stored there if you use certificate rollover. They are apparently stored in the ADFS DB or in AD in a certificate container or .. There's a number of inconclusive posts on this matter.
But it did lead to me learning something about how to find a certificate from the thumbprint.
You you use the certificate plugin from mmc.
Right-click in the top level and then "Find Certificates".
Then you can put a thumbprint (or part of one) and search on "SHA1 Hash". There are other parameters you can search on as well.
You'll then get a list of the certificates that match and if you scroll over to the right, the stores that they are contained in.
Or you can use PowerShell from the root directory.
dir -recurse | where {$_.Thumbprint -eq "5D278138246AE7E7C71F580F07E1BCEC6AA4D27E"} | Format-List -property *
where the thumbprint is the one you are looking for.
Or you can use Raf's amazing utility "Deploy Manager":
DeployManager June 2011 edition
Just remember to run it in Admin. mode.
It bears repeating that you can also extract the certificates from the ADFS metadata.
ADFS : Getting certificate data from metadata
Enjoy!
Subscribe to:
Posts (Atom)

