症状
a) 您需要将文件从 SAP 应用程序服务器传输到仅支持 SFTP 协议的接收方。但是,SAP 应用程序服务器只能使用 HTTPS 协议发送文件。此外,您可能希望在发送前对文件进行加密。
b) 您需要通过 HTTPS 将文件从远程服务器传输到 SAP 应用程序服务器。此外,您可能希望在保存之前解密文件。
目前没有标准的程序或工具可用于文件加密、解密和传输。因此,您需要创建一个自定义程序。本说明为您提供示例编码以支持您创建自己的程序。
请注意:PGP 加密不是SAP Employee Central Payroll 服务产品的一部分。原因如下: PGP 需要在应用服务器上安装额外的操作级软件,这在云环境中是不可能的
其他条款
SAP SuccessFactors Employee Central Payroll、SFTP 服务器、文件传输、加密、解密
原因和先决条件
在使用您的自定义程序之前,必须满足以下先决条件:
您有权创建报告程序、从应用程序服务器检索文件以及将它们上传到远程服务器。
在本地服务器上启动用于出站处理的程序的用户对本地文件具有 READ 授权:授权对象 S_DATASET、PROGRAM = SAPLSCMS_FILE、ACTVT = 33(读取)、FILENAME = <本地文件名,包括完整路径>。
请注意:这并不一定意味着该用户可以显示文件内容。例如,如果您既未在程序中使用值帮助,也未授予用户对象 S_TCODE 和 TCD = AL11 的授权,则他们将无法从 UI 访问文件内容。
在 FILE 事务中,您维护了传出和传入文件的逻辑路径和文件名。
在 SM59 事务中,您维护了一个类型为 G =“HTTP 连接到外部服务器”的 RFC 目标,并将远程服务器作为目标主机。您已在“登录和安全”选项卡上维护了远程服务器的用户名和密码。两个系统中必要的基本配置都已完成(例如,在系统中建立可信连接、授权等)。要创建到外部服务器的 HTTPS 连接,Employee Central Payroll 系统必须信任服务器的证书。
要使用 SSL 连接,您需要通过 STRUST 事务附加外部服务器的 CA 证书。示例报告使用默认客户端 PSE(SSL 客户端标准)连接到远程服务器。
您已成功执行 RFC 目标的连接测试。
仅相关,如果您想使用加密功能:
在 STRUST 事务中,您维护了一个 PSE 并导入了您要发送的文件的最终收件人的证书。有关 STRUST 的更多信息,请参阅https://help.sap.com/viewer/2...
解决方案
SAP SuccessFactors 为客户提供对 SFTP 服务器的访问。您可以先通过HTTPS从ABAP应用服务器向这个SFTP服务器发送文件,然后再通过SFTP协议从SFTP服务器传输给接收方。除了使用 SuccessFactors SFTP 服务器,您还可以将文件发送到任何其他通过 HTTPS 协议接受文件的远程服务器。
本笔记所附的示例代码显示,
a) 来自 ABAP 应用程序服务器的文件如何通过 HTTPS 检索、加密和发送到远程服务器
b) 如何通过 HTTPS 检索来自远程服务器的文件、解密并将其存储在 ABAP 应用程序服务器上。
示例程序只为 PSE 和收件人提供一对输入字段。在生产场景中,您不会使用相同的 PSE 和收件人进行加密和解密。但是在您的实施和测试阶段,您可能想要检查是否正确调用了加密功能。为此,输入 PSE 所有者作为接收者(证书主题):只有这样,您才能在同一个 PSE 中同时拥有用于加密的公钥和用于解密的私钥。
如果您对加密或解密有任何问题,请检查系统日志(SM21 事务)以获取有关问题根源的信息。
示例程序使用您在 SM59 事务中维护的 RFC 连接。如果您将目标系统的凭据存储在该 RFC 连接中,您可以安排程序并将其作为后台作业运行:凭据将从 SM59 配置中获取,并且在文件传输期间不会提示您输入它们。
注意:在创建自己的程序时,请特别注意示例代码中以“@CUSTOMER”开头的注释,因为您需要实现自己的逻辑。通过示例程序的流程逻辑,您可以看到如何调用功能(本地读/写、http 文件传输、解密/加密)。
注意:示例编码并非旨在高效使用,SAP 既不提供任何支持,也不对您基于此示例可能实施的任何内容负责。这尤其适用于安全问题:您有责任为您的编码添加安全功能,并相应地配置您的系统(例如,保护您的系统免受病毒侵害)。
注意:示例程序中使用的 SSF_KRN_ENVELOPE 和 SSF_KRN_DEVELOPE 密码功能模块仅支持公钥密码标准 PKCS#7。非对称密钥必须是 RSA 或 ECDSA。支持的对称密码算法请参考 SAP note 2004653的对应部分。如果要显示所有支持的密码标准的列表,请启动事务 SE38,输入Program Name = SSF02并执行 (F8)。在选项部分,选择SSF 格式字段的值帮助以显示该列表。如果您使用SSFW_KRN_ENVELOPE和SSFW_KRN_DEVELOPE 功能模块,您可以使用这些标准中的任何一个加密/解密文件。
要在您自己的系统中实现示例程序,请执行以下操作:
1.在SE38事务中,新建一个程序。例如,ZSAMPLE_CRYPT_TRANSFER_FILE 或选择任何其他名称。
- 在编辑器中,选择Utilities -> More Utilities -> Upload/Download 并将附件(ZSAMPLE_CRYPT_TRANSFER_FILE.txt)上传 到该程序中。
- 激活程序。
- 选择Goto -> Text Elements为每个选择参数和选择屏幕的每个块定义文本。
您会在选择文本的选项卡上找到一些条目:这些条目是在程序激活期间根据选择参数自动生成的,现在您只需填写文本。通过双击程序中块标题的文本符号 text-<xyz>
为文本符号创建条目。适当的文本包含在示例编码中,作为每个选择参数或块标题旁边的注释,您可以简单地将它们从那里复制到选择文本或文本符号中。
提示:您将在示例编码的末尾找到选择屏幕的定义。
- 激活文本。
*&---------------------------------------------------------------------*
REPORT zsample_crypt_transfer_file.
*&---------------------------------------------------------------------*
*&
*& Sample report for
*& a) transferring a file from the application server
*& to an external file server via HTTP(S) protocol
*& Optionally, the file can be encrypted before sending
*& b) fetching a file from an external server via HTTP(S) and
*& saving it to the application server.
*& Optionally, the file can be decrypted before saving
*&
*& !!! Basic example only - coding needs to be adapted by customer!!!
*&
*& For adapting to customer specific needs, pay special attention
*& to comments marked with '@CUSTOMER'
*&
*& !!! MESSAGE and WRITE statements !!!
*& !!! to be used only for testing in dialog mode!!!
*& Define appropriate messages and write to application log
*& in order to run the program in batch mode
*&
*&---------------------------------------------------------------------*
*& M O D I F I C A T I O N L O G *
*&---------------------------------------------------------------------*
*& Date Author Description *
*&---------------------------------------------------------------------*
*& yyyy-mm-dd XXXXXXXXXX XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX*
*&
*&---------------------------------------------------------------------*
* ======================================================================
* Local classes
* ======================================================================
* ======================================================================
* lcl_file:
* Represents the file, provides basic operations like SAVE, and
* cryptographic operations
* =====================================================================
CLASS lcl_file DEFINITION FINAL.
PUBLIC SECTION.
TYPES:
tty_line TYPE STANDARD TABLE OF ssfdata .
CONSTANTS gc_mode_orig TYPE c VALUE '1' ##NO_TEXT.
CONSTANTS gc_mode_decrypted TYPE c VALUE '2' ##NO_TEXT.
CONSTANTS gc_mode_encrypted TYPE c VALUE '3' ##NO_TEXT.
CONSTANTS gc_line_length TYPE i VALUE 255 ##NO_TEXT.
METHODS save
IMPORTING
!iv_pathname TYPE fileintern
!iv_mode TYPE flag DEFAULT '2' .
METHODS encrypt
IMPORTING
!iv_pse TYPE ssfappl
!iv_recipient TYPE certsubjct
RAISING
cx_crypto_error .
METHODS decrypt
IMPORTING
!iv_pse TYPE ssfappl
!iv_recipient TYPE certsubjct
RAISING
cx_crypto_error .
METHODS create_from_xstring
IMPORTING
!iv_xstring TYPE xstring
!iv_pathname TYPE string
!iv_bytes TYPE i OPTIONAL .
METHODS load_from_applsrv
IMPORTING
!iv_pathname TYPE fileintern
!iv_filename TYPE string
RETURNING
VALUE(rv_subrc) TYPE i .
METHODS get_mimetype
RETURNING
VALUE(rv_mimetype) TYPE w3conttype .
METHODS get_xstring
IMPORTING
!iv_mode TYPE c
EXPORTING
!ev_xstring TYPE xstring
!ev_length TYPE i
!ev_subrc TYPE sysubrc .
PRIVATE SECTION.
DATA: mv_extension TYPE string,
mt_decrypted_line TYPE tty_line,
mt_encrypted_line TYPE saml2_pse_bin_data_t,
mt_source_line TYPE tty_line,
mv_decrypted_length TYPE i,
mv_encrypted_length TYPE i,
mv_filename TYPE string,
mv_source_length TYPE i,
mv_mimetype TYPE w3conttype.
METHODS set_name_and_type
IMPORTING
!iv_pathname TYPE string .
ENDCLASS.
CLASS lcl_file IMPLEMENTATION.
METHOD create_from_xstring.
* IMPORTING
* !iv_xstring TYPE xstring
* !iv_pathname TYPE string
* !iv_bytes TYPE i OPTIONAL .
" -------------------------------------------------------------
" Creates file content from given xstring and sets some
" instance attributes.
" Method can be used e.g. after retrieving a file via HTTP GET
" -------------------------------------------------------------
DATA:
lv_xstring TYPE xstring,
lv_line TYPE ssfdata.
lv_xstring = iv_xstring.
IF iv_bytes IS INITIAL.
mv_source_length = xstrlen( lv_xstring ).
ELSE.
mv_source_length = iv_bytes.
ENDIF.
WHILE xstrlen( lv_xstring ) > 0.
lv_line = lv_xstring.
APPEND lv_line TO mt_source_line.
SHIFT lv_xstring LEFT BY gc_line_length PLACES IN BYTE MODE.
ENDWHILE.
set_name_and_type( iv_pathname ).
ENDMETHOD.
METHOD decrypt.
* IMPORTING
* !iv_pse TYPE ssfappl
* !iv_recipient TYPE certsubjct
* RAISING
* cx_crypto_error .
" -----------------------------------------------------------------
" Decrypts the binary content of the original file and
" puts the result into mt_decrypted_line
" -----------------------------------------------------------------
FIELD-SYMBOLS:
<ls_source_line> TYPE ssfdata.
DATA:
ls_encrypted_line TYPE ssfbin,
lt_encrypted_line TYPE saml2_pse_bin_data_t,
lv_ssftoolkit TYPE ssftoolkit,
lv_str_format TYPE ssfform,
lv_str_profile TYPE ssfprof,
lv_crc TYPE ssfreturn,
lt_recipient TYPE TABLE OF ssfinfo,
ls_recipient TYPE ssfinfo.
" Before decrypting, we need to re-format the content:
" Decryption works with a structured line type, but
" the original content has a flat line type
LOOP AT mt_source_line ASSIGNING <ls_source_line>.
CLEAR ls_encrypted_line.
ls_encrypted_line-bindata = <ls_source_line>.
APPEND ls_encrypted_line TO lt_encrypted_line.
ENDLOOP.
CALL FUNCTION 'SSF_GET_PARAMETER'
EXPORTING
mandt = sy-mandt
application = iv_pse
IMPORTING
ssftoolkit = lv_ssftoolkit
str_format = lv_str_format
str_profile = lv_str_profile
EXCEPTIONS
OTHERS = 1.
IF sy-subrc <> 0.
WRITE: / 'SSF parameter read failed - see system log (SM21)'.
RAISE EXCEPTION TYPE cx_crypto_error.
ENDIF.
" function module needs a recipient list:
ls_recipient-id = iv_recipient.
ls_recipient-profile = lv_str_profile.
APPEND ls_recipient TO lt_recipient.
CALL FUNCTION 'SSF_KRN_DEVELOPE'
EXPORTING
ssftoolkit = lv_ssftoolkit
str_format = lv_str_format
ostr_enveloped_data_l = mv_source_length
IMPORTING
ostr_output_data_l = mv_decrypted_length
crc = lv_crc
TABLES
ostr_enveloped_data = lt_encrypted_line
recipient = lt_recipient
ostr_output_data = mt_decrypted_line
EXCEPTIONS
OTHERS = 1.
IF sy-subrc <> 0 OR lv_crc <> 0 OR mt_decrypted_line IS INITIAL.
WRITE: / 'Decryption for file ', mv_filename, ' failed - see system log (SM21)'.
RAISE EXCEPTION TYPE cx_crypto_error.
ELSE.
WRITE: / 'File ', mv_filename, ' decrypted'.
ENDIF.
ENDMETHOD.
METHOD encrypt.
* IMPORTING
* !iv_pse TYPE ssfappl
* !iv_recipient TYPE certsubjct
* RAISING
*

最低0.47元/天 解锁文章
1434

被折叠的 条评论
为什么被折叠?



