Protect-CmsMessage

使用加密消息语法格式加密内容。

语法

Protect-CmsMessage
       [-To] <CmsMessageRecipient[]>
       [-Content] <PSObject>
       [[-OutFile] <String>]
       [<CommonParameters>]
Protect-CmsMessage
       [-To] <CmsMessageRecipient[]>
       [-Path] <String>
       [[-OutFile] <String>]
       [<CommonParameters>]
Protect-CmsMessage
       [-To] <CmsMessageRecipient[]>
       [-LiteralPath] <String>
       [[-OutFile] <String>]
       [<CommonParameters>]

说明

Protect-CmsMessage cmdlet 使用加密消息语法 (CMS) 格式加密内容。

CMS cmdlet 支持使用 IETF 格式加密和解密内容,如 RFC5652 所述。

CMS 加密标准采用公钥加密系统,其中用来加密内容的密匙(公匙)和用来解密内容的密匙(私匙)是分离的。 公匙可以广泛共享,它不是敏感数据。 如果用此公匙加密了任何内容,只有你的私匙可以解密它。 有关详细信息,请参阅 Public-key cryptography(公钥加密)。

必须先设置加密证书,然后才能运行 Protect-CmsMessage cmdlet。 若要在 PowerShell 中识别,加密证书需要唯一的扩展密钥用法 (EKU) ID 来将其标识为数据加密证书(例如代码签名和加密邮件的 ID)。 有关适用于文档加密的证书的示例,请参阅本主题中的示例 1。

PowerShell 7.1 中添加了对 Linux 和 macOS 的支持。

示例

示例 1:创建证书以用于加密内容

在运行 Protect-CmsMessage cmdlet 之前,必须创建加密证书。 使用以下文本,将“主题”行中的名称更改为名称、电子邮件或其他标识符,并将证书保存在文件中(如 DocumentEncryption.inf,如此示例所示)。

# Create .INF file for certreq
{[Version]
Signature = "$Windows NT$"

[Strings]
szOID_ENHANCED_KEY_USAGE = "2.5.29.37"
szOID_DOCUMENT_ENCRYPTION = "1.3.6.1.4.1.311.80.1"

[NewRequest]
Subject = "cn=youralias@emailaddress.com"
MachineKeySet = false
KeyLength = 2048
KeySpec = AT_KEYEXCHANGE
HashAlgorithm = Sha1
Exportable = true
RequestType = Cert
KeyUsage = "CERT_KEY_ENCIPHERMENT_KEY_USAGE | CERT_DATA_ENCIPHERMENT_KEY_USAGE"
ValidityPeriod = "Years"
ValidityPeriodUnits = "1000"

[Extensions]
%szOID_ENHANCED_KEY_USAGE% = "{text}%szOID_DOCUMENT_ENCRYPTION%"
} | Out-File -FilePath DocumentEncryption.inf

# After you have created your certificate file, run the following command to add
# the certificate file to the certificate store. Now you are ready to encrypt and
# decrypt content with the next two examples.
certreq.exe -new DocumentEncryption.inf DocumentEncryption.cer

示例 2:加密通过电子邮件发送的消息

$Protected = "Hello World" | Protect-CmsMessage -To "*youralias@emailaddress.com*"

在以下示例中,将消息“Hello World”通过管道传递给 Protect-CmsMessage cmdlet 来加密消息,然后将加密的消息保存在变量中。 To 参数使用证书中 Subject 行的值。

示例 3:查看文档加密证书

PS C:\> cd Cert:\CurrentUser\My
PS Cert:\CurrentUser\My> Get-ChildItem -DocumentEncryptionCert

若要查看证书提供程序中的文档加密证书,可以添加 Get-ChildItem 的动态参数 DocumentEncryptionCert,仅在加载证书提供程序时才可用。

参数

-Content

指定 PSObject,其中包含要加密的内容。 例如,可以加密事件消息的内容,然后使用包含消息的变量(在本示例中为 $Event)作为 Content参数的值:$event = Get-WinEvent -ProviderName "PowerShell" -MaxEvents 1。 还可以使用 Get-Content cmdlet 获取文件(如 Microsoft Word 文档)的内容,并将内容保存在用作 Content 参数值的变量中。

类型:PSObject
Position:1
默认值:None
必需:True
接受管道输入:True
接受通配符:False

-LiteralPath

指定要加密的内容的路径。 与 Path 不同,LiteralPath 的值严格按照所键入的形式使用。 不会将任何字符解释为通配符。 如果路径包括转义符,请将其括在单引号中。 单引号告知 PowerShell 不要将任何字符解释为转义序列。

类型:String
Position:1
默认值:None
必需:True
接受管道输入:False
接受通配符:False

-OutFile

指定要将加密内容发送到的文件的路径和文件名。

类型:String
Position:2
默认值:None
必需:False
接受管道输入:False
接受通配符:False

-Path

指定要加密的内容的路径。

类型:String
Position:1
默认值:None
必需:True
接受管道输入:False
接受通配符:False

-To

指定一个或多个 CMS 消息收件人,这些收件人使用以下任何格式进行标识:

  • 实际证书(从证书提供程序检索到的)。
  • 指向包含证书的文件的路径。
  • 指向包含证书的目录的路径。
  • 证书的指纹(用于在证书存储中查找)。
  • 证书的使用者名称(用于在证书存储中查找)。
类型:CmsMessageRecipient[]
Position:0
默认值:None
必需:True
接受管道输入:False
接受通配符:False