如何在PHP中使用客户端证书而非密钥实现OpenID Connect?
基于Jumbojett库实现Azure AD/Entra的客户端证书OIDC认证
针对你的场景,只需在现有代码中添加私钥加载逻辑即可完成private_key_jwt认证方式的配置,以下是修改后的完整代码:
require_once 'vendor/autoload.php'; use Jumbojett\OpenIDConnectClient; // 替换为实际的Azure AD OIDC地址、客户端ID $oidc = new OpenIDConnectClient('https://login.microsoftonline.com/[租户ID]/v2.0', '你的客户端ID', null); $oidc->setTokenEndpointAuthMethodsSupported(['private_key_jwt']); // 加载本地私钥文件(替换为你的私钥PEM文件路径) $privateKeyPath = '/path/to/your/private-key.pem'; $privateKey = file_get_contents($privateKeyPath); // 如果私钥设置了密码保护,传入密码作为第二个参数 // $oidc->setPrivateKey($privateKey, '私钥密码'); $oidc->setPrivateKey($privateKey); // 可选:如果Azure门户中配置了密钥ID(kid),可以指定该值 // $oidc->setPrivateKeyKid('你的密钥指纹或kid'); $oidc->authenticate(); print_r($oidc->requestUserInfo());
关键配置说明
- 私钥加载:通过
file_get_contents读取本地PEM格式的私钥文件,确保PHP进程有读取该文件的权限,同时严格限制文件访问权限避免私钥泄露。 - 密码保护私钥:若生成私钥时设置了密码,必须在
setPrivateKey方法中传入密码参数,否则无法正常使用私钥签名请求。 - 密钥ID(kid):如果Azure AD客户端配置中指定了密钥的kid值,通过
setPrivateKeyKid方法设置,确保Azure能匹配到你上传的对应公钥。
验证要点
- 用
openssl命令确认本地私钥与Azure上传的公钥指纹一致:openssl x509 -noout -fingerprint -sha256 -in public-key.pem - 确保Azure AD/Entra客户端的认证方法已设置为
Private key JWT。
内容的提问来源于stack exchange,提问作者Nick
相关产品推荐
相关产品推荐

