#Linux系统生成证书:(推荐使用)
sudo yum install openssl (CentOS)
#生成私钥文件
openssl genrsa -out idsrv4.key 2048
#创建证书签名请求文件 CSR(Certificate Signing Request),用于提交给证书颁发机构(即 Certification Authority (CA))即对证书签名,申请一个数字证书。
openssl req -new -key idsrv4.key -out idsrv4.csr
#生成自签名证书(证书颁发机构(CA)签名后的证书,因为自己做测试那么证书的申请机构和颁发机构都是自己,crt 证书包含持有人的信息,持有人的公钥,以及签署者的签名等信息。当用户安装了证书之后,便意味着信任了这份证书,同时拥有了其中的公钥。)
openssl x509 -req -days 365 -in idsrv4.csr -signkey idsrv4.key -out idsrv4.crt (包含公钥)
#自签名证书与私匙合并成一个文件(注:.pfx中可以加密码保护,所以相对安全些)
openssl pkcs12 -export -in idsrv4.crt -inkey idsrv4.key -out idsrv4.pfx (注:在生成的过程中会让我们输入Export Password)
或者
openssl req -newkey rsa:2048 -nodes -keyout idsrv4.key -x509 -days 365 -out idsrv4.cer
openssl pkcs12 -export -in idsrv4.cer -inkey idsrv4.key -out idsrv4.pfx
都可以生成证书
只有pfx格式的数字证书是包含有私钥的,cer格式的数字证书里面只有公钥没有私钥。
所以在IdentityServer4中
services.AddIdentityServer()
//.AddDeveloperSigningCredential()
.AddSigningCredential(new X509Certificate2(Path.Combine(basePath,
Configuration["Certificates:CerPath"]),
Configuration["Certificates:Password"]))
这里的证书是pfx的证书,so 通过私钥来签名,在访问API的时候 ,通过这个证书来获取公钥进行验签。
而在SharePoint ADFS中
可以看到
里面的令牌签名是cer的 ,cer意味着只有公钥,上面还有个令牌解密,应该是私钥,然后把这个公钥颁给了SharePoint
在SharePoint 服务器上,以管理员身份启动SharePoint 命令行管理程序:
序号 |
命令说明 |
执行命令 |
1 |
设置ADFS签名证书变量,此处Tokensign.cer证书是从ADFS服务器上导出的令牌签名证书 |
$cert = New-Object System.Security.Cryptography.x509Certificates.x509Certificate2 (“\\ad-test\Software\Tool\Tokensign.cer") |
2 |
将令牌签名证书导入到SharePoint的信任区 |
New-SPTrustedRootAuthority -Name "Token Signing Cert" -Certificate $cert |
3 |
设置UPN声明变量 |
$upnClaimMap = New-SPClaimTypeMapping -IncomingClaimType "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/upn" -IncomingClaimTypeDisplayName "UPN" -SameAsIncoming |
设置通用名声明变量 |
$cnNameMap = New-SPClaimTypeMapping -IncomingClaimType "http://schemas.xmlsoap.org/claims/CommonName" -IncomingClaimTypeDisplayName "Display Name" –SameAsIncoming |
|
4 |
设置“realm”声明变量,此处一定要与ADFS信赖方信任配置的“信赖方标识符”一致,包括大小写 |
$realm = “urn:Dev2:SP2013” |
5 |
设置登录URL变量,此处为ADFS登录的页URL |
$signInURL = “https://adfs.****.com/adfs/ls” |
6 |
$ap = New-SPTrustedIdentityTokenIssuer -Name "ADFS Web SSO for SharePoint" -description “ADFS Web SSO for SharePoint" -realm $realm -ImportTrustCertificate $cert -ClaimsMappings $upnClaimMap, $cnNameMap -SignInURL $signInURL -IdentifierClaim $upnClaimMap.InputClaimType |
|
7 |
|
Get-SPTrustedIdentityTokenIssuer |
其实原理都是一样的,一个ADFS将token 用私钥签名 ,sharepoint 中的公钥验签。