Citrix ADC

MPX 14000 FIPS 设备

重要:

  • MPX 9700/10500/12500/15500 FIPS 平台已经到达使用寿命的终点。

  • NetScaler MPX 14000 FIPS 和 NetScaler MPX 9700/10500/12500/15500 FIPS 设备的配置步骤是不同的。MPX 14000 FIPS 设备不使用固件版本 2.2。在 MPX 9700 平台的硬件安全模块 (HSM) 上创建的 FIPS 密钥不能传输到 MPX 14000 平台的 HSM。另一种方式也不受支持。但是,如果您已将 RSA 密钥作为 FIPS 密钥导入,则可以将 RSA 密钥复制到 MPX 14000 平台。然后将其作为 FIPS 密钥导入。只支持 2048 位和 3072 位密钥。

FIPS 设备配备了防篡改加密模块 Cavium CNN3560-NFBE-G,设计符合 FIPS 140-2 级 3 规范(自版本 12.0 内部版本 56.x 起)。关键安全参数 (CSP),主要是服务器的私钥,在加密模块(也称为 HSM)中安全地存储和生成。CSP 永远不会在 HSM 边界之外访问。只有超级用户 (nsroot) 可以对存储在 HSM 中的密钥执行操作。

在配置 FIPS 设备之前,必须检查 FIPS 卡的状态,然后初始化卡。创建 FIPS 密钥和服务器证书,并添加任何其他 SSL 配置。

有关所支持的 FIPS 密码的信息,请参阅 FIPS 批准的算法和密码

有关在 HA 设置中配置 FIPS 装置的信息,请参阅在 HA 设 置中在设备上配置 FIPS

限制

  1. MPX FIPS 设备的后端不支持使用 SSLv3 协议进行 SSL 重新协商。
  2. 不支持 1024 位和 4096 位密钥以及指数值 3。
  3. 不支持 4096 位服务器证书。
  4. 不支持 4096 位客户端证书(如果在后端服务器上启用了客户端身份验证)。

配置 HSM

在 MPX 14000 FIPS 设备上配置 HSM 之前,请检查 FIPS 卡的状态以验证驱动程序是否正确加载。然后初始化卡。

在命令提示符下,键入:

show fips

FIPS Card is not configured
Done
<!--NeedCopy-->

如果驱动程序未正确加载,则会显示消息 “错误:不允许操作-系统中没有 FIPS 卡”。

初始化 FIPS 卡

必须重新启动设备三次才能正确初始化 FIPS 卡。

重要

  • 验证目 /nsconfig/fips 录是否已在设备上成功创建。
  • 在第三次重新启动设备之前,请勿保存配置。

执行以下步骤初始化 FIPS 卡:

  1. 重置 FIPS 卡。
  2. 重新启动设备。
  3. 为分区 0 和 1 设置安全官员密码,为分区设置用户密码

    注意:设置或重置命令运行时间超过 60 秒。

  4. 保存配置。
  5. 验证主分区 (master_pek.key) 的密码加密密钥是否已在 /nsconfig/fips/ 目录中创建。
  6. 重新启动设备。
  7. 验证是否在 /nsconfig/fips/ 目录中创建了默认分区 (default_pek.key) 的密码加密密钥。
  8. 重新启动设备。
  9. 验证 FIPS 卡是否处于上升状态。

使用 CLI 初始化 FIPS 卡

set fips 命令初始化 FIPS 卡上的硬件安全模块 (HSM),并设置新的安全官员密码和用户密码。

警告: 此命令会擦除 FIPS 卡上的所有数据。继续执行命令之前,系统会提示您。运行此命令之前和之后需要重新启动才能应用更改。运行此命令后和重新启动设备之前保存配置。

在命令提示符下,键入以下命令:

reset fips
 Done

reboot

set fips -initHSM Level-2 so12345 so12345 user123 -hsmLabel NSFIPS

This command will erase all data on the FIPS card. You must save the configuration (saveconfig) after executing this command. Do you want to continue?(Y/N)y

Done
<!--NeedCopy-->

注意: 运行 set fips 命令时将显示以下消息:

This command will erase all data on the FIPS card. You must save the configuration (saveconfig) after executing this command. [Note: On MPX/SDX 14xxx FIPS platform, the FIPS security is at Level-3 by default, and the -initHSM Level-2 option is internally converted to Level-3]  Do you want to continue?(Y/N)y

saveconfig
Done

reboot

reboot

show fips

        FIPS HSM Info:
                 HSM Label              : NetScaler FIPS
                 Initialization         : FIPS-140-2 Level-3
                 HSM Serial Number      : 3.1G1836-ICM000136
                 HSM State              : 2
                 HSM Model              : NITROX-III CNN35XX-NFBE
                 Hardware Version       : 0.0-G
                 Firmware Version       : 1.0
                 Firmware Build         : NFBE-FW-1.0-48
                 Max FIPS Key Memory    : 102235
                 Free FIPS Key Memory   : 102231
                 Total SRAM Memory      : 557396
                 Free SRAM Memory       : 262780
                 Total Crypto Cores     : 63
                 Enabled Crypto Cores   : 63
 Done
<!--NeedCopy-->

创建 FIPS 密钥

您可以在 MPX 14000 FIPS 设备上创建 FIPS 密钥,或将现有 FIPS 密钥导入设备。MPX 14000 FIPS 设备仅支持 2048 位和 3072 位密钥,并且指数值为 F4(其值为 65537)。对于 PEM 键,不需要指数。验证 FIPS 密钥是否已正确创建。创建证书签名请求和服务器证书。最后,将证书密钥对添加到您的设备。

指定密钥类型(RSA 或 ECDSA)。对于 ECDSA 键,请仅指定曲线。支持使用曲线 P_256 和 P_384 创建 ECDSA 密钥。

注意 : 不支持 1024 位和 4096 位密钥以及指数值 3。

使用 CLI 创建 FIPS 密钥

在命令提示符下,键入:

create ssl fipsKey <fipsKeyName> -keytype ( RSA | ECDSA ) [-exponent ( 3 | F4 )] [-modulus <positive_integer>] [-curve ( P_256 | P_384 )]
<!--NeedCopy-->

示例 1:

create fipsKey f1 -keytype RSA -modulus 2048 -exponent F4
Done

show ssl fipskey f1

FIPS Key Name: f1  Key Type: RSA Modulus: 2048   Public Exponent: F4 (Hex: 0x10001)
Done
<!--NeedCopy-->

示例 2:

> create fipskey f2 -keytype ECDSA -curve P_256
 Done

> sh fipskey f2
    FIPS Key Name: f2   Key Type: ECDSA Curve: P_256
 Done
<!--NeedCopy-->

通过使用 GUI 创建 FIPS 密钥

  1. 导航到 流量管理 > SSL > FIPS
  2. 在详细信息窗格的 FIPS 密钥选项卡上,单击 添加
  3. 在“创建 FIPS 密钥”对话框中,为以下参数指定值:

    • FIPS 密钥名称*— fipsKeyName
    • 模量*— 模量
    • 指数* — 指数

    *必需的参数

  4. 单击 Create(创建),然后单击 Close(关闭)。
  5. 在 FIPS 密钥选项卡上,验证为您创建的 FIPS 密钥显示的设置是否正确。

导入 FIPS 密钥

要将现有 FIPS 密钥与 FIPS 设备结合使用,您需要将 FIPS 密钥从设备的硬盘传输到其 HSM。

注意: 为避免导入 FIPS 密钥时出现错误,请确保导入的密钥的名称与创建时的原始密钥名称相同。

使用 CLI 导入 FIPS 密钥

在命令提示符下,键入:

import ssl fipsKey <fipsKeyName> -key <string> [-inform <inform>] [-wrapKeyName <string>] [-iv<string>] -exponent  F4 ]
<!--NeedCopy-->

示例:

import fipskey Key-FIPS-2 -key Key-FIPS-2.key -inform SIM -exponent F4
Done

import fipskey Key-FIPS-2 -key Key-FIPS-2.key -inform PEM
Done
<!--NeedCopy-->

通过运行show fipskey 命令验证 FIPS 密钥是否已正确创建或导入。

show fipskey
1)      FIPS Key Name: Key-FIPS-2
Done
<!--NeedCopy-->

通过使用 GUI 导入 FIPS 密钥

  1. 导航到 流量管理 > SSL > FIPS

  2. 在详细信息窗格的 FIPS 密钥选项卡上,单击 导入

  3. 在“导入为 FIPS 密钥”对话框中,选择 FIPS 密钥文件并为以下参数设置值:

    • FIPS 密钥名称*
    • 键文件名 * — 要将文件放在默认位置以外的位置,请指定完整路径或单击 浏览 并导航到某个位置。
    • 指数*

    *必需的参数

  4. 单击 Import(导入),然后单击 Close(关闭)。

  5. 在 FIPS 密钥选项卡上,验证为导入的 FIPS 密钥显示的设置是否正确。

导出 FIPS 密钥

Citrix 建议您创建在 FIPS HSM 中创建的任何密钥的备份。如果删除 HSM 中的密钥,则无法再次创建同一个密钥,并且与该密钥关联的所有证书都将失去用处。

除了将密钥导出为备份之外,您可能需要导出密钥才能传输到另一台设备。

以下过程提供了有关将 FIPS 密钥导出到设备 CompactFlash 上的 /nsconfig/ssl 文件夹以及使用强非对称密钥加密方法保护导出的密钥的说明。

使用 CLI 导出 FIPS 密钥

在命令提示符下,键入:

export ssl fipsKey <fipsKeyName> -key <string>
<!--NeedCopy-->

示例:

export fipskey Key-FIPS-1 -key Key-FIPS-1.key
<!--NeedCopy-->

使用 GUI 导出 FIPS 密钥

  1. 导航到 流量管理 > SSL > FIPS

  2. 在详细信息窗格的 FIPS 密钥选项卡上,单击 导出

  3. 在“将 FIPS 键导出到文件”对话框中,为以下参数指定值:

    • FIPS 密钥名称*— fipsKeyName
    • 文件名*— 键(要将文件放在默认位置以外的位置,您可以指定完整路径或单击“浏览”按钮并导航到某个位置。)

    *必需的参数

  4. 单击 “ 导出”,然后单击 “ 关闭”。

导入外部密钥

您可以传输在 Citrix ADC 设备的 HSM 中创建的 FIPS 密钥。您还可以将外部私钥(例如在标准 Citrix ADC、Apache 或 IIS 上创建的密钥)转移到 Citrix ADC FIPS 设备。外部密钥是通过使用 OpenSSL 等工具在 HSM 之外创建的。在将外部密钥导入 HSM 之前,请将其复制到设备的闪存驱动器中 /nsconfig/ssl

在 MPX 14000 FIPS 设备上,导入外部密钥时不需要 import ssl fipskey 命令中的-指数参数。导入密钥时会自动检测到正确的公共指数,并忽略-指数参数的值。

Citrix ADC FIPS 设备不支持具有 3 或 F4 以外的公共指数的外部密钥。

你不需要在 MPX 14000 FIPS 设备上使用包装键。

不能将外部、加密的 FIPS 密钥直接导入 MPX 14000 FIPS 设备。要导入密钥,您需要先解密密钥,然后导入密钥。要解密密钥,请在 shell 提示符处键入:

openssl rsa -in <EncryptedKey.key> > <DecryptedKey.out>
<!--NeedCopy-->

注意: 如果将 RSA 密钥导入为 FIPS 密钥,Citrix 建议您从设备中删除 RSA 密钥,出于安全考虑。

使用 CLI 将外部密钥作为 FIPS 密钥导入

  1. 将外部密钥复制到设备的闪存驱动器。
  2. 如果密钥是 .pfx 格式,则必须先将其转换为 PEM 格式。在命令提示符下,键入:

    convert ssl pkcs12 <output file> -import -pkcs12File <input .pfx file name> -password <password>
    <!--NeedCopy-->
    
  3. 在命令提示符下,键入以下命令以将外部密钥导入为 FIPS 密钥并验证设置:

    import ssl fipsKey <fipsKeyName> -key <string> -informPEM
    show ssl fipskey<fipsKeyName>
    <!--NeedCopy-->
    

示例:

convert ssl pkcs12 iis.pem -password 123456 -import -pkcs12File iis.pfx

import fipskey Key-FIPS-2 -key iis.pem -inform PEM

show ssl fipskey key-FIPS-2

FIPS Key Name: Key-FIPS-2 Modulus: 0   Public Exponent: F4 (Hex value 0x10001)
<!--NeedCopy-->

使用 GUI 导入外部密钥作为 FIPS 密钥

  1. 如果密钥是 .pfx 格式,则必须先将其转换为 PEM 格式。

    1. 导航到流量管理 > SSL
    2. 在详细信息窗格的工具下,单击 导入 PKCS #12
    3. 在“导入 PKCS12 文件”对话框中,设置以下参数:
      • 输出文件名*
      • PKCS12 文件名* — 指定 .pfx 文件名。
      • 导入密码*
      • 编码格式 * 必填参数
  2. 导航到 流量管理 > SSL > FIPS

  3. 在详细信息窗格的 FIPS 密钥选项卡上,单击 导入

  4. 在“导入为 FIPS 键”对话框中,选择 PEM 文件,并为以下参数设置值:

    • FIPS 密钥名称*
    • 密钥文件名称* — 要将文件放在默认位置以外的位置,您可以指定完整路径或单击“浏览”并导航到某个位置。

    *必需的参数

  5. 单击 Import(导入),然后单击 Close(关闭)。

  6. 在 FIPS 密钥选项卡上,验证为导入的 FIPS 密钥显示的设置是否正确。

在 HA 设置中在设备上配置 FIPS

您可以将一个 HA 对中的两个装置配置为 FIPS 装置。

必备条件

  • 必须在两台设备上配置硬件安全模块 (HSM)。有关详细信息,请参阅 配置 HSM
  • 使用 GUI 时,请确保设备已处于高可用性设置中。有关配置 HA 设置的更多信息,请参阅 高可用性

注意 : Citrix 建议您对此过程使用配置实用程序 (GUI)。如果您使用命令行 (CLI),请确保仔细遵循过程中列出的步骤。更改步骤顺序或指定不正确的输入文件可能会导致不一致,需要重新启动设备。此外,如果使用 CLI,则 create ssl fipskey 命令不会传播到辅助节点。当您在两个不同的 FIPS 设备上使用相同的模数大小和指数输入值运行命令时,生成的密钥不一样。在其中一个节点上创建 FIPS 密钥,然后将其传输到另一个节点。但是,如果您使用配置实用程序在 HA 设置中配置 FIPS 设备,您创建的 FIPS 密钥将自动传输到辅助节点。管理和传输 FIPS 密钥的过程称为安全信息管理 (SIM)。

重要提示: HA 设置必须在六分钟内完成。如果该过程在任何步骤失败,请执行以下操作:

  1. 重新启动设备或等待 10 分钟。
  2. 删除该过程创建的所有文件。
  3. 重复 HA 设置过程。

不要重复使用现有的文件名。

在以下过程中,设备 A 是主节点,设备 B 是辅助节点。

使用 CLI 在 HA 设置中的设备上配置 FIPS

下图总结了 CLI 上的传输过程。

图 1. 转移 FIPS 密钥摘要

SIM 过程详情

  1. 在设备 A 上,使用 SSH 客户端(如 PuTTY)打开与设备的 SSH 连接。

  2. 使用管理员凭据登录到设备。

  3. 将设备 A 初始化为源设备。在命令提示符下,键入:

    init ssl fipsSIMsource <certFile>
    <!--NeedCopy-->
    

    示例:

    init fipsSIMsource /nsconfig/ssl/nodeA.cert

  4. 将此<certFile> 文件复制到 /nconfig/ssl 文件夹中的设备 B。

    示例:

    scp /nsconfig/ssl/nodeA.cert nsroot@198.51.100.10:/nsconfig/ssl

  5. 在设备 B 上,使用 SSH 客户端(如 PuTTY)打开与设备之间的 SSH 连接。

  6. 使用管理员凭据登录到设备。

  7. 将设备 B 初始化为目标设备。在命令提示符下,键入:

    init ssl fipsSIMtarget <certFile> <keyVector> <targetSecret>
    <!--NeedCopy-->
    

    示例:

    init fipsSIMtarget /nsconfig/ssl/nodeA.cert /nsconfig/ssl/nodeB.key /nsconfig/ssl/nodeB.secret

  8. 将此<targetSecret> 文件复制到设备 A。

    示例:

    scp /nsconfig/ssl/fipslbdal0801b.secret nsroot@198.51.100.20:/nsconfig/ssl

  9. 在设备 A上,启用设备 A 作为源设备。在命令提示符下,键入:

    enable ssl fipsSIMSource <targetSecret> <sourceSecret>
    <!--NeedCopy-->
    

    示例: enable fipsSIMsource /nsconfig/ssl/nodeB.secret /nsconfig/ssl/nodeA.secret

  10. 将此<sourceSecret> 文件复制到设备 B。

    示例: scp /nsconfig/ssl/fipslbdal0801b.secret nsroot@198.51.100.10:/nsconfig/ssl

  11. 在设备 B上,启用设备 B 作为目标设备。在命令提示符下,键入:

    enable ssl fipsSIMtarget <keyVector> <sourceSecret>
    <!--NeedCopy-->
    

    示例: enable fipsSIMtarget /nsconfig/ssl/nodeB.key /nsconfig/ssl/nodeA.secret

  12. 设备 A 上,创建 FIPS 密钥,如 创建 FIPS 密钥中所述。

  13. 如导出 FIPS 密钥中所述,将 FIPS 密钥导出到设备的硬盘。

  14. 使用安全文件传输实用程序(如 SCP)将 FIPS 密钥复制到辅助设备的硬盘。

  15. 装置 B 上,将 FIPS 密钥从硬盘导入设备的 HSM,如 导入 FIPS 密钥中所述。

使用 GUI 在 HA 设置中的装置上配置 FIPS

  1. 在要配置为源(主)设备的设备上,导航到“流量管理”>“SSL”>“FIPS”。
  2. 在详细信息窗格的 FIPS 信息选项卡上,单击 启用 SIM卡。
  3. 在“为 HA 对启用 SIM”对 话框的“证书文件名”文本框中,键入文件名。文件名必须包含源设备上必须存储 FIPS 证书的位置的路径。
  4. 键矢量文件名文本框中,键入文件名。文件名必须包含源设备上必须存储 FIPS 密钥矢量的位置的路径。
  5. 在“目 标密钥文件名”文本框中,键入用于在目标设备上存储密钥数据的位置。
  6. 源密钥文件名文本框中,键入用于在源设备上存储密钥数据的位置。
  7. 辅助系统登录凭据下,输入用户名密码的值。
  8. 单击 OK(确定)。FIPS 设备现在配置为 HA 模式。

注意: 在 HA 中配置设备后,请创建 FIPS 密钥,如 创建 FIPS 密钥中所述。FIPS 密钥会自动从主设备传输到辅助设备。

使用 CLI 创建证书签名请求

在命令提示符下,键入:

create ssl certReq <reqFile> (-keyFile <input_filename> | -fipsKeyName <string>) [-keyform ( DER | PEM )  {-PEMPassPhrase }] -countryName <string> -stateName <string> -organizationName<string> [-organizationUnitName <string>] [-localityName <string>] [-commonName <string>] [-emailAddress <string>] {-challengePassword } [-companyName <string>] [-digestMethod ( SHA1 | SHA256 )]
<!--NeedCopy-->

示例:

>create certreq f1.req –fipsKeyName  f1 -countryName US  -stateName CA -organizationName Citrix -companyName Citrix -commonName ctx -emailAddress test@example.com
Done
<!--NeedCopy-->

使用 CLI 创建服务器证书

在命令提示符下,键入:

create ssl cert <certFile> <reqFile> <certType> [-keyFile <input_filename>] [-keyform ( DER | PEM ) {-PEMPassPhrase }] [-days <positive_integer>] [-certForm ( DER | PEM )] [-CAcert <input_filename>] [-CAcertForm ( DER | PEM )] [-CAkey <input_filename>][-CAkeyForm ( DER | PEM )] [-CAserial <output_filename>]
<!--NeedCopy-->

示例:

create cert f1.cert f1.req SRVR_CERT -CAcert ns-root.cert -CAkey ns-root.key -CAserial ns-root.srl -days 1000
Done
<!--NeedCopy-->

上述示例使用设备上的本地根 CA 创建服务器证书。

使用 CLI 添加证书密钥对

在命令提示符下,键入:

add ssl certKey <certkeyName> (-cert <string> [-password]) [-key <string> | -fipsKey <string> | -hsmKey <string>] [-inform <inform>][-expiryMonitor ( ENABLED | DISABLED ) [-notificationPeriod <positive_integer>]] [-bundle ( YES | NO )]
<!--NeedCopy-->

示例:

add certkey cert1 -cert f1.cert -fipsKey f1
Done
<!--NeedCopy-->

创建 FIPS 密钥和服务器证书后,您可以添加通用 SSL 配置。启用部署所需的功能。添加服务器、服务和 SSL 虚拟服务器。将证书密钥对和服务绑定到 SSL 虚拟服务器。保存配置。

enable ns feature SSL LB
Done

add server s1 10.217.2.5
Done

add service sr1 s1 HTTP 80
Done

add lb vserver v1 SSL 10.217.2.172 443
Done

bind ssl vserver v1 –certkeyName cert1
Done

bind lb vserver v1 sr1
Done

 saveconfig
Done
<!--NeedCopy-->

MPX 14000 FIPS 设备的基本配置现已完成。

有关配置安全 HTTPS 的信息,请单击 配置 FIPS

有关配置安全 RPC 的信息,请 首次单击配置 FIPS

更新 MPX 14000 FIPS 设备上的许可证

在此平台上对许可证的任何更新都需要重新启动两次。

  1. 更新 /nsconfig/license 文件夹中的许可证。
  2. 重新启动设备。
  3. 登录到设备。
  4. 重新启动设备。 注意: 不要在第二次重新启动之前添加新命令、保存配置或检查系统状态。
  5. 登录到设备并确保通过运行show ssl fips 命令初始化 FIPS。

在 MPX 14000 FIPS 和 SDX 14000 FIPS 平台上支持混合 FIPS 模式

注意 : 此功能仅在包含一个主 FIPS 卡和一个或多个辅助卡的新 MPX/SDX 14000 FIPS 平台上支持。VPX 平台或仅包含一种硬件卡的平台不支持此功能。

在 FIPS 平台上,出于安全原因,在 FIPS 卡上执行非对称和对称加密和解密。但是,您可以在 FIPS 卡上执行此活动的一部分(非对称),并将批量加密和解密(对称)卸载到另一张卡,而不会影响密钥的安全性。

新的 MPX/SDX 14000 FIPS 平台包含一个主卡和一个或多个辅助卡。如果启用混合 FIPS 模式,则主卡上运行预主机密解密命令,因为私钥存储在此卡上。但是,批量加密和解密将卸载到辅助卡。与非混合 FIPS 模式和现有的 MPX 9700/10500/12500/15000 FIPS 平台相比,这种卸载显著提高了 MPX/SDX 14000 FIPS 平台上的批量加密吞吐量。启用混合 FIPS 模式还可提高此平台上每秒 SSL 事务的速度。

备注:

  • 混合 FIPS 模式默认被禁用,以满足严格的认证要求,即所有加密计算都必须在 FIPS 认证的模块内完成。启用混合模式以将批量加密和解密卸载到辅助卡。

  • 在 SDX 14000 FIPS 平台上,您必须先向 VPX 实例分配 SSL 芯片,然后才能启用混合模式。

使用 CLI 启用混合 FIPS 模式

在命令提示符下,键入:

set SSL parameter -hybridFIPSMode {ENABLED|DISABLED}

Arguments

hybridFIPSMode

When this mode is enabled, system will use additional crypto hardware to accelerate symmetric crypto operations.

Possible values: ENABLED, DISABLED

Default value: DISABLED
<!--NeedCopy-->

示例:

    set SSL parameter -hybridFIPSMode ENABLED
    show SSL parameter
    Advanced SSL Parameters
    -----------------------
    . . . . . . . . . . . .
    Hybrid FIPS Mode    : ENABLED
    . . . . . . . . . . . .
    Done
<!--NeedCopy-->

通过使用 GUI 启用混合 FIPS 模式

  1. 导航到流量管理 > SSL
  2. 在详细信息窗格的“设置”下,单击“更改高级 SSL 设置”。
  3. 在“更改高级 SSL 设置”对话框中,选择“混合 FIPS 模式”。

限制:

  1. 不支持重新协商。

  2. SDX 14000 平台上的stat ssl parameter 命令不显示正确的辅助卡利用率百分比。它始终显示 0.00% 的利用率。

stat ssl

SSL Summary
# SSL cards present 1
# SSL cards UP  1
# Secondary SSL cards present   4
# Secondary SSL cards UP    4
SSL engine status      1
SSL sessions (Rate)     963
Secondary card utilization (%)     0.00
<!--NeedCopy-->